2011-02-19 2 views
8

식 평가할 때 :하스켈 : 식 예기치 출력 [0, 0.1 .. 1]

*main> [0, 0.1 .. 1] 

I 실제로 기대되었다

[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] 

이유는 하스켈에 따라 그 결과를 않습니다 수 평가?

+0

[ghci가 1.1 + 1.1 + 1.1> 3.3이 참이라고 말하는 이유는 무엇입니까?] (http://stackoverflow.com/questions/2038647/why-does-ghci-say-that-1-1- 1-1-1-1-3-3-is-true) – Gabe

+0

@TomMD, @Avilo : 명확한 사람들을 보내 주셔서 감사합니다. 그러나 나는 또한 예를 들어 0.3 ... 0004과 .5 , .6, .7 모두 0001에서 끝나고 .2, .8 및 .9는 "둥근"입니다. 일관성있는 부정확성이 아닌 것 같아요, 자신을 설명하고 있는지 모르겠습니다. – Carlos

+1

@carlos 부동 소수점이 어떻게 표현되는지를 배울 때 이것은 완벽하게 이해할 수 있습니다. 정확한 값은 2와 음수의 합입니다. –

답변

19

이것은 정확도가 floating point 인 부정확 한 결과이며, 하스켈과 관련이 없습니다. 당신이 부동 소수점 고유의 근사치를 처리 할 수없는 경우 다음 높은 성능 비용 Rational를 사용할 수 있습니다

>>> 0.3 
0.29999999999999999 

을 그리고 여기 :

> 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] 

그냥 점 가정을 망치, 여기 파이썬입니다 C :

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

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

this other post을 참조하십시오. 그것이 말하는 바와 같이 부동 소수점 숫자는 CPU에서 정확하지 않습니다.

관련 문제