枚举列表时的奇数值

dan*_*tin 3 haskell

作为更大函数定义的一部分,我需要允许函数的域(i,n)以不同的速率从i递增到n.所以我写道:

f (i, n) k = [i, (i+k)..n]
Run Code Online (Sandbox Code Playgroud)

进入GHC.这返回了奇怪的结果:

*Main> f (0.0, 1.0) 0.1
[0.0,0.1,0.2,0.30000000000000004,0.4000000000000001,0.5000000000000001,0.6000000000000001,0.7000000000000001,0.8,0.9,1.0]
Run Code Online (Sandbox Code Playgroud)

为什么GHC会返回,例如0.30000000000000004而不是0.3?

Mar*_*tos 9

因为IEEE浮点运算通常不能精确地表示十进制数.二进制表示中始终存在舍入误差,有时在显示数字时渗透到曲面.

根据GHC如何将浮点数转换为十进制表示,您可能会发现在Windows上它将结果显示为预期结果0.3.这是因为Microsoft的运行时库比Linux和Mac更聪明,它们是如何呈现浮点数的.

编辑:情况可能并非如此.当使用IEEE浮点数时,该数字0.3将编码为整数3fd3333333333333,而0.1 + 0.1 + 0.1将生成一个编码为的数字3fd3333333333334,并且我不知道Microsoft的运行时库是否足够容忍以0.3在显示时回滚到该数字.

无论如何,不​​同处理的一个很好的例子是键入0.3Python交互式shell.如果它是Python 2.6,你会回来0.29999999999999999,如果它是2.7,它将显示0.3.

  • @danportin另见http://docs.sun.com/source/806-3568/ncg_goldberg.html"每个计算机科学家应该知道的关于浮点运算的内容" (3认同)