【问题标题】:How do I convert a decimal exponent like e+308 (in base 10) to a hexadecimal number with equivalent magnitude?如何将像 e+308 (以 10 为底)这样的十进制指数转换为具有等效大小的十六进制数?
【发布时间】: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;

【问题讨论】:

  • 你能用calcPython 代替吗?还是必须使用 C++?
  • 我可以使用 C 或 C++,或者如果您有任何其他语言的示例,我相信我可以自己进行转换。
  • 这个问题完全不清楚。您能否发布慢速十进制函数,以便我们了解您要执行的操作。您的解释说您已尝试使用十进制数,但想使用十六进制数。所有数字在计算机内部都是二进制的。你在使用字符串吗?您的数据是如何格式化的?
  • 我有一个十进制的指数,我想要等效的指数,但是是十六进制的。我看看能不能贴一些代码。
  • 你不能。考虑数字 0.1E1 和 0.15E2。它们的十进制指数为 1 和 2,尽管它们的十六进制表示的十六进制指数均为 1。

标签: c++ find hex decimal exponent


【解决方案1】:

0.1e+308 = 10^307

Log10 (10^307) = 307

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

【讨论】:

  • 谢谢!我想这就是我一直在寻找的答案。
猜你喜欢
  • 2012-03-14
  • 2010-10-14
  • 2020-10-04
  • 1970-01-01
  • 2015-06-25
  • 2010-10-31
  • 2017-12-28
  • 2023-02-20
  • 2015-01-26
相关资源
最近更新 更多