c++ - 如何将像 e+308(以 10 为底)这样的十进制指数转换为具有等效大小的十六进制数?
问题描述
比如说,我有数字 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;
解决方案
0.1e+308 = 10^307
对数 10 (10^307) = 307
Log16 (10^307) = Log10(10^307) / Log10(16) = 307 / Log10(16)
推荐阅读
- laravel - 当我使用 get() 时,在 laravel 查询中返回错误 500
- javascript - 如何在javascript中比较两个对象数组?
- c# - 如何在 GeckoFx 组件的 C# 中更改页面语言
- javascript - 将 AngularJS 服务转换为 typescript 文件
- ios - TEMP FIX - 构建和上传 iOS 应用程序博览会(没有应用程序加载器)
- excel - Hod 使用 VBA 将数据从一张表复制到另一张表,列选择有限
- vue.js - Vue2leaflet 标记簇未显示
- drupal-8 - 服务文件“core/core.services.yml”无效
- sas - SAS中的列而不是行中的日期 - 优点?
- nativescript - 对象原型可能只是一个对象或 null: undefined Nativescript Angular