haskell - 浮点列表生成器

标签 haskell floating-point

Possible Duplicate:
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,为什么列表创建不进行比较?

最佳答案

Arithmetic sequences根据 reference implementation of the Prelude,当值大于最终值加 1/2 时, float 停止。 :

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)

至于为什么,你必须询问委员会,但很可能他们不希望范围最终“不完整”,并且认为它有点太大会不那么不直观。对于浮点,它总是会是其中之一。

关于haskell - 浮点列表生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9810002/

相关文章:

performance - 现代 x86 成本模型

haskell - 如何在没有应用程序的情况下在 Haskell 中实现 uncurry point-free?

haskell - haskell中的递归数据结构: prolog-like terms

haskell - 右左如何读取值

java - 如何降低变量的精度?

c++ - 如何在不重新发明轮子的情况下为自定义类型生成均匀分布的随机实数?

python - 将 float 列表转换为 NumPy 数组

haskell - 如何用foldl实现zip(用一种急切的语言)

haskell - 计算句子中特定单词的出现次数haskell

c++ - 为什么 Clang 优化掉 x * 1.0 而不是 x + 0.0?