作为更大函数定义的一部分,我需要允许函数的域(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?
因为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.