我很惊讶我在 SO 上找不到关于这个的重复问题。我想我的回答与the FAQ in the manual 略有不同,因为这是一个常见的第一个问题。 糟糕,我不知何故错过了:Factorial function works in Python, returns 0 for Julia
假设您学过加法和乘法,但从未学过任何高于 99 的数字。就您而言,根本不存在比这更大的数字。所以你学会了将一个带入十列,但你甚至不知道你将携带十位的那一列叫什么。所以你把它们扔掉。只要你的数字永远不会超过 99,一切都会好起来的。一旦你超过 99,你就会回到 0。所以 99+3 ≡ 2 (mod 100)。和 52*9 ≡ 68 (mod 100)。任何时候你用超过两个 10 的因数进行乘法运算,你的答案都是零:25*32 ≡ 0 (mod 100)。现在,在你每次计算之后,有人可能会问你“你超过 99 了吗?”但这需要时间来回答……时间可以用来计算你的下一个数学问题!
这实际上是计算机在本机进行算术运算的方式,除了它们以 64 位二进制进行运算。您可以使用bits 函数查看各个位:
julia> bits(45)
"0000000000000000000000000000000000000000000000000000000000101101"
当我们将其乘以 2 时,101101 将向左移动(就像十进制乘以 10):
julia> bits(45 * 2)
"0000000000000000000000000000000000000000000000000000000001011010"
julia> bits(45 * 2 * 2)
"0000000000000000000000000000000000000000000000000000000010110100"
julia> bits(45 * 2^58)
"1011010000000000000000000000000000000000000000000000000000000000"
julia> bits(45 * 2^60)
"1101000000000000000000000000000000000000000000000000000000000000"
……直到它开始从末端掉下来。如果将 64 个以上的二相乘,则答案将始终为零(就像上面示例中将两个以上的十相乘一样)。我们可以询问计算机是否溢出,但默认情况下,每次计算都有some serious performance implications。所以在 Julia 中你必须是明确的。您可以要求 Julia 在特定乘法后进行检查:
julia> Base.checked_mul(45, 2^60) # or checked_add for addition
ERROR: OverflowError()
in checked_mul at int.jl:514
或者您可以将其中一个参数提升为 BigInt:
julia> bin(big(45) * 2^60)
"101101000000000000000000000000000000000000000000000000000000000000"
在您的示例中,当您使用大整数运算时,您可以看到答案是 1 后跟 81 个零:
julia> bin(big(2) ^ 3 ^ 4)
"1000000000000000000000000000000000000000000000000000000000000000000000000000000000"
更多详情,请参阅常见问题解答:why does julia use native machine integer arithmetic?