锁定。这个问题及其答案是locked因为这个问题是题外话,但具有历史意义。它目前不接受新的答案或互动。
您如何向仍然认为计算机无限智慧和准确的新程序员和外行解释浮点不准确?
您是否有一个最喜欢的例子或轶事,它似乎比精确但枯燥的解释更能传达这个想法?
这在计算机科学类(class)中是如何教授的?
最佳答案
人们在使用浮点数时基本上会遇到两个主要的陷阱。
PS> $a = 1; $b = 0.0000000000000000000000001
PS> Write-Host a=$a b=$b
a=1 b=1E-25
PS> $a + $b
1
作为这种情况的类比,您可以想象一个大游泳池和一茶匙水。两者的尺寸非常不同,但单独您可以轻松掌握它们的大致大小。然而,将茶匙倒入游泳池后,您仍然会看到一个充满水的游泳池。
(如果学习这个的人对指数表示法有困难,也可以使用值
1
和 100000000000000000000
左右。) 0.1
的数字不能用有限数量的二进制数字精确表示。不过,有些语言掩盖了这一点:PS> "{0:N50}" -f 0.1
0.10000000000000000000000000000000000000000000000000
但是您可以通过将数字重复相加来“放大”表示错误:
PS> $sum = 0; for ($i = 0; $i -lt 100; $i++) { $sum += 0.1 }; $sum
9,99999999999998
不过,我想不出一个很好的比喻来正确解释这一点。这基本上是相同的问题,为什么您只能大约用十进制表示 1/3,因为要获得确切的值,您需要在小数部分的末尾无限重复 3。
类似地,二进制分数适用于表示二分之一、四分之一、八分之一等,但十分之一之类的东西会产生无限重复的二进制数字流。
现在,如果您对该数字执行计算(加、减、乘等),则会失去精度。每个数字只是一个近似值,因此您实际上是在执行间隔计算。结果也是一个区间,逼近误差只会越来越大,从而扩大了区间。您可能会从该计算中得到一个数字。但这只是可能结果区间中的一个数字,考虑到原始操作数的精度和计算导致的精度损失。
那种东西叫做Interval arithmetic至少对我来说,这是我们大学数学类(class)的一部分。
关于floating-point - 浮点不准确示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2100490/