将科学计数法中的十进制数转换为IEEE 754

时间:2011-09-15 03:26:34

标签: ieee-754 scientific-notation

我已经阅读了一些文本和线程,展示了如何从十进制转换为IEEE 754,但我仍然感到困惑的是如何在不扩展小数的情况下转换数字(用科学计数法表示)

我特别合作的号码是9.07 * 10^23,但任何号码都可以;我将弄清楚如何为我的特定例子做到这一点。

2 个答案:

答案 0 :(得分:2)

我假设您希望结果是最接近十进制数的浮点数,并且您使用的是双精度浮点数。

对于大多数人来说,有一种方法可以相对快速地完成。以下是它的工作原理。

您需要将数字拆分为产品或具有精确表示为浮点数的一小部分数字。可以表示的10的最大功率是10 ^ 22。因此,要以浮点形式获得9.07e + 23,我们可以写:

9.07e+23 = 907 * 10^21

根据IEEE-754标准,单个浮点运算保证正确舍入,因此上述乘积(以2个双精度浮点数的乘积计算)将得到正确的舍入结果。< / p>

如果你在转换函数中使用它,你可能会在数组中存储10的幂。

请注意,您不能将此方法用于9.07e-23。这个数字等于907/10 ^ 23,因此分母太大而无法准确表示。在这种情况下,以及其他非常大或非常小的数字处理,你必须使用某种形式的高精度算术。

有关详细信息和示例,请参阅Fast Path Decimal to Floating-Point Conversion

答案 1 :(得分:1)

如果您知道如何进行IEEE浮点加法和乘法,那么将数字从十进制字符串转换为二进制IEEE是非常简单的。 (或者如果您使用的是C / C ++等基本编程语言)

有很多不同的方法,但最简单的方法是直接评估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

现在,&#34;规模&#34;二进制指数消失的数字。这是通过乘以适当的10的幂来实现的,并且#34;去掉&#34;二进制指数。

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来缩小&#34; 2^40。确定所需的10的功率简单地等于:

power of 10 = (power of 2) * log(2)/log(10)