【发布时间】:2019-07-17 12:32:12
【问题描述】:
说,我有数字 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;
【问题讨论】:
-
你能用calc 或
Python代替吗?还是必须使用 C++? -
我可以使用 C 或 C++,或者如果您有任何其他语言的示例,我相信我可以自己进行转换。
-
这个问题完全不清楚。您能否发布慢速十进制函数,以便我们了解您要执行的操作。您的解释说您已尝试使用十进制数,但想使用十六进制数。所有数字在计算机内部都是二进制的。你在使用字符串吗?您的数据是如何格式化的?
-
我有一个十进制的指数,我想要等效的指数,但是是十六进制的。我看看能不能贴一些代码。
-
你不能。考虑数字 0.1E1 和 0.15E2。它们的十进制指数为 1 和 2,尽管它们的十六进制表示的十六进制指数均为 1。
标签: c++ find hex decimal exponent