为什么大数运算在Haskell中使用'int'在某一点返回负数?

时间:2016-02-11 03:29:23

标签: haskell numbers int

具有以下功能:
factorial :: Int -> Int
factorial n = product [1..n]

返回参数小于21的正确值。例如: factorial 20返回2432902008176640000,但factorial 21返回-4249290049419214848,即使该值不是负值,也不正确。

我知道应该使用这些大小数字Integer,但具体是这里发生的错误及其原因?

1 个答案:

答案 0 :(得分:5)

Haskell中的

Int是具有有限范围的整数的固定精度表示。与大多数固定精度整数表示的情况一样,算术操作将创建一个太大或太小而无法表示的整数(如Mephy所述,称为整数溢出)将其结果包装,将其截断为最低有效位。例如:

λ> maxBound + 1 :: Int
-9223372036854775808

λ> (maxBound + 1 :: Int) == minBound
True