如何将十进制指数(如e + 308)(基数为10)转换为具有等效幅度的十六进制数?

问题描述 投票:-4回答:1

说,我的号码是0.1e + 308。如何获取指数308(基数为10),并以十六进制(基数16)找到正确的指数?

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

我需要这个,因为我有一个例程,它在数字的末尾添加正确的零数。我使用了十进制(基数为10),但是我的例程需要太长时间(约20秒)才能找到答案。

但是,如果我使用十六进制,我可以在不到一秒的时间内找到结果。因为将base 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++ find hex decimal exponent
1个回答
2
投票

0.1e + 308 = 10 ^ 307

Log10(10 ^ 307)= 307

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

© www.soinside.com 2019 - 2024. All rights reserved.