如何将e + 308之类的十进制指数(以10为基数)转换为等效大小的十六进制数?

时间:2019-02-23 16:26:11

标签: c++ find hex decimal exponent

说,我的电话号码是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;

1 个答案:

答案 0 :(得分:2)

0.1e + 308 = 10 ^ 307

Log10(10 ^ 307)= 307

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