如何解决十进制浮点到二进制转换
对于我的计算机体系结构课,我必须做以下简单的练习:
将数字 -1,1 转换为 IEEE 754 单精度浮点格式,然后将二进制数转换为十六进制。
这个练习的答案似乎是 0xbf8ccccd,但我有一个问题理解为什么十六进制数的最后一位是 d 而不是 c。
我似乎犯了错误的步骤是当我尝试将数字 -1.1 的小数部分转换为二进制时。具体来说,我首先取 0.1 乘以 2,每次保存整数部分。
在某一点之后,我看到某种模式出现了。这个模式是 1100,它的出现是因为我们从 0.4 开始,在几次乘法之后又回到 0.4。
使用这种方法,我得到了号码,0001100110011001100。
根据在线转换器以及通过练习的结果可以看出,0.1 的正确二进制表示是 0.0001100110011001101。
有没有人知道为什么模式在最后被打破,以及我思考过程中的错误在哪里?
提前致谢!
解决方法
将数字 -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
模式被破坏,因为使用了四舍五入值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。