说,我的号码是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;
0.1e + 308 = 10 ^ 307
Log10(10 ^ 307)= 307
Log16(10 ^ 307)= Log10(10 ^ 307)/ Log10(16)= 307 / Log10(16)