十进制浮点到二进制转换

Posted

技术标签:

【中文标题】十进制浮点到二进制转换【英文标题】:Decimal Floating Point to Binary Conversion 【发布时间】:2021-09-10 02:36:02 【问题描述】:

对于我的计算机体系结构课,我必须做以下简单的练习:

将数字 -1,1 转换为 IEEE 754 单精度浮点格式,然后将二进制数转换为十六进制。

这个练习的解决方案似乎是0xbf8ccccd,但我很难理解为什么十六进制数字的最后一位是d而不是c。

我似乎犯了错误的步骤是当我尝试将数字 -1.1 的小数部分转换为二进制时。具体来说,我先取 0.1,然后将其乘以 2,然后每次保存整数部分。

在某一点之后,我看到出现了某种模式。这种模式是 1100,它的出现是因为我们从 0.4 开始,经过几次乘法后又以 0.4 结束。

使用这种方法,我最终得到了数字,0001100110011001100

根据在线转换器以及通过练习的结果可以看出,0.1 的正确二进制表示是 0.0001100110011001101

有谁知道为什么模式在最后会被打破,以及我思考过程中的错误在哪里?

提前致谢!

【问题讨论】:

2/3 是接近 0.666 还是接近 0.667 ? @prapin 哦,我明白了!我认为我们进行了乘法运算,直到我们填充了与我们的单精度相对应的 23 位的所有空间,但我认为我不必对数字进行四舍五入。这是我在无法准确表示数字的类似情况下必须做的事情吗?无论哪种方式,非常感谢您指出显而易见的事情! 【参考方案1】:

将数字 -1,1 转换为 IEEE 754 单精度浮点格式。

这是不可能的完全。所有IEEE 754 single-precision floating-point 都是某个整数(最多 24 位)乘以 2 的某个幂。 -1.1 和 0.1 不能这样表示。

最接近 0.1 的两个候选者:

0.0999999940395355224609375 
0.100000001490116119384765625 <-- closer

知道为什么模式在最后会被打破,我的思维过程中的错误在哪里?

当 OP 尝试“我首先取 0.1 并将其乘以 2 并每次保存整数部分。”时,数学结果模式将是:

0001100110011001100110011001100... without end.

然而,由于 binary32 具有 24 位有效精度,因此使用了 四舍五入

   123456789012345678901234
0001100110011001100110011001100...
rounds to 
000110011001100110011001101

模式被损坏,因为使用了一个四舍五入的值。

【讨论】:

以上是关于十进制浮点到二进制转换的主要内容,如果未能解决你的问题,请参考以下文章

浮点型十进制与浮点型二进制的转换(小白版)

从二进制转换为 IEEE 浮点

浮点到 16 位二进制补码二进制,Python

无法将除法结果转换为浮点或十进制类型

shell脚本之使用bc工具实现数值转换(浮点转二进制)

字节数组byte[]和整型,浮点型数据的转换——Java代码