DigitalRoss..
17
问题是浮点格式表示基数2中的分数.
第一个分数位是½,第二个分数是1/4,它继续为1/2 n.
和这个问题即是,并非每一个有理数(可以表示成两个整数之比的数)实际上具有在该基部2格式的有限表示.
(这使得浮点格式难以用于货币值.虽然这些值总是有理数(n/100),但只有.00,.25,.50和.75实际上具有任意数字位数的精确表示.基础两部分.)
无论如何,当你添加它们时,系统最终有机会将结果四舍五入到它可以准确表示的数字.
在某些时候,它发现自己将.666 ...数字添加到.333 ...中,就像这样:
00111110 1 .o10101010 10101010 10101011
+ 00111111 0 .10101010 10101010 10101011o
------------------------------------------
00111111 1 (1).0000000 00000000 0000000x # the x isn't in the final result
最左边的位是符号,接下来的8位是指数,剩下的位是分数.在指数和分数之间是一个假定的"1",它始终存在,因此实际上不存储,作为归一化的最左边分数位.我写的零实际上不是单独的位o.
这里发生了很多事情,每一步,FPU采取了相当英勇的措施来围绕结果.已经保留了两个额外的精度数字(超出了结果中适合的数字),并且FPU在许多情况下知道剩下的最右边位中的任何一个或至少一个是否为1.如果是这样,则该部分的那部分超过0.5(缩放),因此它向上舍入.中间舍入值允许FPU将最右边的位一直传送到整数部分,最后舍入到正确的答案.
这没有发生,因为任何人都增加了0.5; FPU在格式的限制范围内尽力而为.实际上,浮点不是不准确的.这是完全准确的,但我们期望在我们的基数10,有理数世界观中看到的大多数数字不能用格式的基数2分数来表示.事实上,很少有人.