将科学计数法表示的十进制数转换为IEEE 754格式

3

我已经阅读了一些关于如何将十进制转换为IEEE 754的文本和线程,但仍然不清楚如何在不展开科学计数法表示的小数的情况下进行数字转换。

我要转换的数字是9.07 * 10^23,但任何数字都可以; 我会想出如何为我的特定示例执行此操作。

2个回答

2

如果您知道如何进行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

现在,需要“缩放”这个数字,使得二进制指数消失。这可以通过乘以适当的10的幂来实现,以“摆脱”二进制指数。
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.09e23,你会发现9.09e23 - (9 + 9/100.0) * 1e23并不等于零。 - Jeffrey Sax
OP从未说过它必须正确舍入。你几乎肯定需要多精度算术才能正确舍入 - 这是另一个话题... - Mysticial

2
我假设您想要的结果是最接近十进制数的浮点数,并且您正在使用双精度浮点数。
对于大多数数字,有一种相对快速的方法来实现。以下是简要说明:
您需要将数字分解为具有浮点数的精确表示形式的乘积或分数。可精确表示的最大10的幂是10^22。因此,要以浮点形式获取9.07e+23,则可以编写如下内容:
9.07e+23 = 907 * 10^21

根据IEEE-754标准,单精度浮点运算保证正确舍入,因此上述乘积,作为两个双精度浮点数的乘积计算,将给出正确舍入的结果。
如果您要在转换函数中使用这个,您可能会将10的幂存储在一个数组中。
请注意,您无法对9.07e-23使用此方法。这个数字等于907 / 10^23,因此分母太大而无法准确表示。在这种情况下,以及其他处理非常大或非常小的数字的情况下,您必须使用某种形式的高精度算术。
有关详细信息和示例,请参见快速路径十进制到浮点转换

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接