浮点列表生成器

时间:2012-03-21 17:45:17

标签: haskell floating-point

  

可能重复:
  Haskell ranges and floats

如果我在ghci中生成一个列表,那么

let a = [0.1,1..10]

这给了我一个带有以下条目的列表

[0.1,1.0,1.9,2.8,3.6999999999999997,4.6,5.5,6.4,7.300000000000001,8.200000000000001,9.100000000000001,10.000000000000002]

列表的最后一个元素是10.000000000000002,我假设这只是由于浮点使用。但是,与数字10相比,结果似乎不一致,例如,

last a > 10
True

last a < 10
False

为什么列表创建不比较最终元素是否小于或等于10?

1 个答案:

答案 0 :(得分:6)

当值大于最终值加1/2时,

Arithmetic sequences浮点数停止reference implementation of the Prelude

numericEnumFrom         :: (Fractional a) => a -> [a]  
numericEnumFromThen     :: (Fractional a) => a -> a -> [a]  
numericEnumFromTo       :: (Fractional a, Ord a) => a -> a -> [a]  
numericEnumFromThenTo   :: (Fractional a, Ord a) => a -> a -> a -> [a]  
numericEnumFrom         =  iterate (+1)  
numericEnumFromThen n m =  iterate (+(m-n)) n  
numericEnumFromTo n m   =  takeWhile (<= m+1/2) (numericEnumFrom n)  
numericEnumFromThenTo n n' m = takeWhile p (numericEnumFromThen n n')  
                             where  
                               p | n' >= n   = (<= m + (n'-n)/2)  
                                 | otherwise = (>= m + (n'-n)/2)

至于为什么,你必须要求委员会,但很可能他们不希望范围最终“不完整”,并认为它有点大会不那么不直观。对于浮点,它总是会是一个或另一个。