为什么在Haskell中用'ints'在某一点做大数运算return负数?
Why do large number operations return negative numbers at a certain point with 'ints' in Haskell?
具有以下功能:
factorial :: Int -> Int
factorial n = product [1..n]
小于21的参数返回正确值,例如:
factorial 20
returns 2432902008176640000,但是 factorial 21
returns -4249290049419214848 即使值不是负数也是不正确的。
我知道这些尺寸数字 Integer
应该已经被利用了,但是这里的错误具体发生在哪里,为什么?
Int
in Haskell 是具有有限范围的整数的固定精度表示。与大多数固定精度整数表示的情况一样,算术运算会创建一个太大或太小而无法表示的整数(称为 整数溢出 ,如Mephy) 将其结果 wrapped 截断为最低有效位。例如:
λ> maxBound + 1 :: Int
-9223372036854775808
λ> (maxBound + 1 :: Int) == minBound
True
具有以下功能:
factorial :: Int -> Int
factorial n = product [1..n]
小于21的参数返回正确值,例如:
factorial 20
returns 2432902008176640000,但是 factorial 21
returns -4249290049419214848 即使值不是负数也是不正确的。
我知道这些尺寸数字 Integer
应该已经被利用了,但是这里的错误具体发生在哪里,为什么?
Int
in Haskell 是具有有限范围的整数的固定精度表示。与大多数固定精度整数表示的情况一样,算术运算会创建一个太大或太小而无法表示的整数(称为 整数溢出 ,如Mephy) 将其结果 wrapped 截断为最低有效位。例如:
λ> maxBound + 1 :: Int
-9223372036854775808
λ> (maxBound + 1 :: Int) == minBound
True