Haskell:表达式的意外输出[0,0.1 .. 1] [英] Haskell: Unexpected output for expression [0, 0.1 .. 1]

查看:192
本文介绍了Haskell:表达式的意外输出[0,0.1 .. 1]的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当评估表达式时:

  * main> [0,0.1 .. 1] 

我实际上期待:

  [0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1] 

但是我很震惊地看到输出是

  [0.0,0.1,0.2,0.30000000000000004,0.4000000000000001,0.5000000000000001,0.6000000000000001,0.7000000000000001,0.8,0.9,1.0] 


$ b $为什么Haskell在评估后产生这样的结果? 这是由于浮点值不精确的结果,Haskell并不特别。如果你不能处理浮点数的近似值,那么你可以使用

 >导入Data.Ratio 
Data.Ratio> [0,1%10 .. 1%1]
[0%1,1%10,1%5,3%10,2%5,1%2,3%5,7%10,4 %5,9%10,1%1]



 >>> 0.3 
0.29999999999999999

这里是C:

  void main(){printf(%0.17f\\\
,0.3); }

$ gcc t.c 2> / dev / null; ./a.out
0.29999999999999999


When evaluating the expression:

*main> [0, 0.1 .. 1]

I was actually expecting:

 [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1]

But I was quite shocked to see the output be

[0.0,0.1,0.2,0.30000000000000004,0.4000000000000001,0.5000000000000001,0.6000000000000001,0.7000000000000001,0.8,0.9,1.0]

Why does Haskell produce that result upon evaluation?

This is a result of the imprecision of floating point values, it isn't particular to Haskell. If you can't deal with the approximation inherent in floating point then you can use Rational at a high performance cost:

> import Data.Ratio
Data.Ratio> [0,1%10.. 1%1]
[0 % 1,1 % 10,1 % 5,3 % 10,2 % 5,1 % 2,3 % 5,7 % 10,4 % 5,9 % 10,1 % 1]

Just to hammer the point home, here's Python:

>>> 0.3
0.29999999999999999

And here's C:

void main() { printf("%0.17f\n",0.3); }

$ gcc t.c 2>/dev/null ; ./a.out
0.29999999999999999

这篇关于Haskell:表达式的意外输出[0,0.1 .. 1]的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆