【发布时间】:2019-05-11 22:41:03
【问题描述】:
所以,我正在学习 IEEE 754,并且有一个问题
为什么某些数字(例如数字 0.1 和 0.2)不是一个值 在 IEEE 754 标准中精确编码?
【问题讨论】:
标签: floating-point binary ieee-754 ieee
所以,我正在学习 IEEE 754,并且有一个问题
为什么某些数字(例如数字 0.1 和 0.2)不是一个值 在 IEEE 754 标准中精确编码?
【问题讨论】:
标签: floating-point binary ieee-754 ieee
IEEE-754 指定二进制和十进制格式。 .1 和 .2 当然可以用十进制表示。
在二进制格式中,每个数字位置对应于 2 的幂。对于位 101.011,位置对应于 4、2、1、1/2、1/4 和 1/8。所以 101.011 表示 1•4 + 0•2 + 1•1 + 0•½ + 1•¼ + 1•⅛ = 4 + 1 + ¼ + ⅛ = 5⅜ = 5.375。我们可以通过调整指数来改变2的幂(这是浮点的“浮动”部分;数字的值是2的幂的倍数,以移动“小数点”的有效位置)。
.1 无法表示,因为不存在总和为 0.1 的 2 次幂的有限集合。假设您有两个 p0、p1 的幂的和 S , p2,… pn,按降序排列。由于 pn 是这些幂中最小的,因此所有其他幂都是它的倍数。也就是说和S是pn的倍数之和,所以它是pn。这意味着对于某些整数 j 和 k,S = j / 2k。如果 S = .1,那么 .1 = j / 2k,所以 2k = 10 j,然后 2k−1 = 5 j。但是如果 2k-1 = 5 j,那么 2k-1是五的倍数。这是不可能的,因为它是二的幂。所以 S 不能是 .1。
【讨论】:
@Eric 已经解释了基础知识。但是,在使用浮点数时,您还需要注意许多其他问题。
我最近看到了这篇关于该主题的博文,其中包含对二进制分数的解释、可能的解决方案出现问题的示例以及包含有关该主题的更多信息的外部链接。
https://www.microforum.cc/blogs/entry/1-floating-point-numbers/
【讨论】: