我已经阅读了一些关于如何将十进制转换为IEEE 754的文本和线程,但仍然不清楚如何在不展开科学计数法表示的小数的情况下进行数字转换。
我要转换的数字是9.07 * 10^23
,但任何数字都可以; 我会想出如何为我的特定示例执行此操作。
我已经阅读了一些关于如何将十进制转换为IEEE 754的文本和线程,但仍然不清楚如何在不展开科学计数法表示的小数的情况下进行数字转换。
我要转换的数字是9.07 * 10^23
,但任何数字都可以; 我会想出如何为我的特定示例执行此操作。
如果您知道如何进行IEEE浮点加法和乘法(或者使用任何基本编程语言,如C / C ++),将十进制字符串转换为二进制IEEE相当简单。
有很多不同的方法可以实现这一点,但最简单的方法是直接计算9.07 * 10 ^ 23
。
首先,从9.07
开始:
9.07 = 9 + 0 * 10^-1 + 7 * 10^-2
现在计算 10^23
。这可以通过从 10 开始使用任何幂算法来完成。
然后将结果相乘。
以下是 C/C++ 中的简单实现:
double mantissa = 9;
mantissa += 0 / 10.;
mantissa += 7 / 100.;
double exp = 1;
for (int i = 0; i < 23; i++){
exp *= 10;
}
double result = mantissa * exp;
现在,反向转换(IEEE -> 十进制)要困难得多。
同样,有很多不同的方法。这是我能想到的最简单的方法。
我将使用1.0011101b * 2^40
作为示例。(尾数是二进制的)
首先,将尾数转换为十进制:(这应该很容易,因为没有指数)
1.0011101b * 2^40 = 1.22656 * 2^40
1.22656 * 2^40 = 1.22656 * (2^40 * 10^-12) * 10^12
= 1.22656 * (1.09951) * 10^12
= 1.34861 * 10^12
所以答案是:
1.0011101b * 2^40 = 1.34861 * 10^12
10^12
来“缩小”2^40
。确定所需的10的幂次方就是简单地等于:power of 10 = (power of 2) * log(2)/log(10)
9.07e+23 = 907 * 10^21
9.09e23 - (9 + 9/100.0) * 1e23
并不等于零。 - Jeffrey Sax