Haskell 为什么大数运算在某一点返回负数,并使用';ints&x27;在哈斯克尔?
具有以下功能:Haskell 为什么大数运算在某一点返回负数,并使用';ints&x27;在哈斯克尔?,haskell,numbers,int,Haskell,Numbers,Int,具有以下功能: factorial::Int->Int factorial n=product[1..n] 返回参数小于21的正确值。例如: factorial20返回2432902008176640000,但factorial21返回-4249290049419214848,即使值不是负值,也不正确 我知道,对于这些大小的数字,Integer应该被使用,但是这里发生的错误具体在哪里,原因是什么?Int在Haskell中,整数是一个有限范围内的固定精度表示。与大多数固定精度整数表示法的情况一样,
factorial::Int->Int
factorial n=product[1..n]
返回参数小于21的正确值。例如:
factorial20
返回2432902008176640000,但factorial21
返回-4249290049419214848,即使值不是负值,也不正确
我知道,对于这些大小的数字,
Integer
应该被使用,但是这里发生的错误具体在哪里,原因是什么?Int
在Haskell中,整数是一个有限范围内的固定精度表示。与大多数固定精度整数表示法的情况一样,如果一个算术运算会创建一个太大或太小而无法表示的整数(正如Mephy所提到的,称为整数溢出),那么它的结果将被截断为最低有效位。例如:
λ> maxBound + 1 :: Int
-9223372036854775808
λ> (maxBound + 1 :: Int) == minBound
True
Haskell中的
Int
是具有有限范围的整数的固定精度表示。与大多数固定精度整数表示法的情况一样,如果一个算术运算会创建一个太大或太小而无法表示的整数(正如Mephy所提到的,称为整数溢出),那么它的结果将被截断为最低有效位。例如:
λ> maxBound + 1 :: Int
-9223372036854775808
λ> (maxBound + 1 :: Int) == minBound
True
..