Haskell: Unexpected output for expression [0, 0.1 .. 1]

前端 未结 2 1285
臣服心动
臣服心动 2020-12-11 04:21

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         


        
相关标签:
2条回答
  • 2020-12-11 04:56

    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
    
    0 讨论(0)
  • 2020-12-11 04:56

    Refer to this other post. As it states, floating point numbers aren't precise in the CPU.

    0 讨论(0)
提交回复
热议问题