首页 > 解决方案 > 如何将像 e+308(以 10 为底)这样的十进制指数转换为具有等效大小的十六进制数?

问题描述

比如说,我有数字 0.1e+308。如何取指数 308(以 10 为底),并找到正确的十六进制指数(以 16 为底)?

我不仅仅意味着将 308 转换为十六进制。- 这很容易!我想找到 e308 的等效十六进制数。

我需要这个,因为我有一个例程,可以将正确数量的零添加到数字的末尾。我使用十进制(以 10 为底),但我的例程需要很长时间(约 20 秒)才能找到答案。

但是,如果我使用十六进制,我可以在不到一秒的时间内找到结果。因为将基数 16 转换为二进制非常快。

我计算的数字非常大,所以想想 BigInteger 之类的东西。但我是用 C++ 编写的。

编辑 1

这是我将十进制字符串转换为二进制位数组的例程。

case 10:
    bitsSum = bits_duplicate(bitsDst);
    if (bitsSum == NULL)
        goto error;
    bitsTen = bits_create_value(maxBits, 10);
    if (bitsTen == NULL)
        goto error;
    int len = str_chars_length(strDup);
    char c;
    for (i = 0; i < len; i++) {
        c = strDup[i] - '0';
        if (c == 0)
            continue;
        if (bits_set(bitsSum, c) == 0)
            goto error;
        for (k = 0; k < len - i - 1; k++) {
            if (bits_multiply(bitsTen, bitsSum) == 0)
                goto error;
        }
        if (bits_add(bitsSum, bitsDst) == 0)
            goto error;
    }
    break;

您可以清楚地看到将字符串值转换为等效的二进制数组很慢,因为它需要乘法和加法。

但是我将十六进制字符串转换为二进制位数组的例程非常快:

        d = ((strDup[i] >= '0' && strDup[i] <= '9') ? strDup[i] - '0' : (strDup[i] >= 'a' && strDup[i] <= 'f') ? strDup[i] - 'a' + 10 : strDup[i] - 'A' + 10);
        bitsDst->bitArray[k++] = (d & 1) ? 1 : 0;
        bitsDst->bitArray[k++] = (d & 2) ? 1 : 0;
        bitsDst->bitArray[k++] = (d & 4) ? 1 : 0;
        bitsDst->bitArray[k++] = (d & 8) ? 1 : 0;

标签: c++findhexdecimalexponent

解决方案


0.1e+308 = 10^307

对数 10 (10^307) = 307

Log16 (10^307) = Log10(10^307) / Log10(16) = 307 / Log10(16)


推荐阅读