浮点 – 浮点不准确的例子

你怎么解释浮点不准确的新鲜程序员和外行谁仍然认为电脑是无限聪明和准确的?
你有一个最喜欢的例子或轶事,似乎得到的想法比一个精确,但干燥,解释更好吗?
如何在计算机科学类教学?
最佳答案
有基本上两个主要陷阱人们绊倒与浮点数。

>规模问题。每个FP数字都有一个指数,它决定了数字的整体“标度”,所以你可以表示真正小的值或真正大的值,虽然你可以投入的位数是有限的。添加两个不同比例的数字有时会导致较小的一个被“食用”,因为没有办法将其装入较大的比例。

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无限地在小数的结尾。

类似地,二进制分数对于表示一半,四分之一,八分之一等是有好处的,但是像十分之一的东西将产生无限重复的二进制数字流。
>然后还有另一个问题,虽然大多数人不会绊倒,除非他们做了大量的数字东西。但那时,那些已经知道的问题。由于许多浮点数仅仅是精确值的近似值,这意味着对于实数r的给定近似f,可以存在无穷多更多的实数r 1,r 2,…,其映射到完全相同的近似。这些数字在一定间隔。让我们说rmin是r的最小可能值,导致f和rmax是r的最大可能值,对于这个值,你有一个间隔[rmin,rmax],其中该间隔中的任何数字可以是你的实际数r 。

现在,如果你对这个数进行计算,加,减,乘等,你会失去精度。每个数字只是一个近似值,因此你实际上是间隔执行计算。结果也是间隔,并且近似误差只有变得更大,从而加宽间隔。您可以从该计算中获取单个数字。但是这只是来自可能结果区间的一个数字,考虑到原始操作数的精度和由于计算的精度损失。

这种东西叫Interval arithmetic,至少对我来说,这是我们在大学的数学课程的一部分。

转载注明原文:浮点 – 浮点不准确的例子 - 代码日志