从大十进制数转换为浮点表示形式



我想我知道如何将十进制数转换为IEEE 754单精度浮点表示形式,但我想确定一下。

我想在 IEEE 754 单精度浮点表示中表示 3.398860921 x 10^18。我知道浮动代表是如何分解的。

第 31 位数字:符号(0 表示 +,1 表示 -)第 30-23 位:表示指数第 22-0 位数字:代表尾数(有效数)

所以符号显然是 0,因为它是一个正数。对于指数,我想出了这个(通过将 18 加到 127 作为偏差),并将指数表示为:1001 0001

对于尾数,

即 3.398860921 部分,我连续将小数点右侧的所有内容乘以 2,如果它大于 1,我标记 1,否则标记为 0。然后拿起新的答案,再次将小数点右侧的所有内容乘以 2,直到我想出足够的位来填充尾数。

所以现在我有:0 |1001 0001 |0110 0110 0001 1011 1011 111

所以当我把它转换成十六进制时,我得到了0x48B30DDF但这是一个与我在 3.398860921 x 10^18 中开始的数字不同的数字

应该是这样还是我在某处犯了错误?任何帮助将不胜感激。

不能将十进制指数用于 IEEE 754 表示形式。IEEE 754 需要一个二进制指数,即当数字表示为 1.xxx... * 2 p 时的数字p

而且您不能使用从十进制

科学记数法直接转换为二进制的尾数,因为它仅与十进制指数相关,您不能直接使用。

算法是将整个数字转换为二进制,然后,然后,对于有效数,取前导位后面的 23 位。对于指数,计算前导位的位置。

对于您的特定值 3.398860921 x 1018,二进制表示为 1.011110010101101011111111111101111011010010010101111010110101101101101×261

这意味着无偏指数61,省略前导位的暂定有效数01111001010110010110111。您可以将从十进制到浮点的转换误差计算为 0.0000000000000000000001111111101111010101010010111101×261,并且由于该误差大于 ULP 的一半,除非您有理由喜欢向下舍入,否则您应该在有效数上加 1,以获得最接近以小数表示的原始数字的单精度值。

最新更新