我刚刚读了 Quora 的一篇文章: http ://www.quora.com/Is-Julia-ready-for-production-use
在底部,有一个答案说:
2 ^ 3 ^ 4 = 0
Run Code Online (Sandbox Code Playgroud)
我自己尝试了一下:
julia> 2 ^ 3 ^ 4
0
Run Code Online (Sandbox Code Playgroud)
就我个人而言,我不认为这是该语言中的错误。为了清楚起见,我们可以为 Julia 和我们人类添加括号:
julia> (2 ^ 3) ^ 4
4096
Run Code Online (Sandbox Code Playgroud)
到目前为止,一切都很好; 但是,这不起作用:
julia> 2 ^ (3 ^ 4)
0
Run Code Online (Sandbox Code Playgroud)
由于我正在学习,我想知道 Julia 如何将这个表达式求值为 0?评价先例是什么?
julia> typeof(2 ^ 3 ^ 4)
Int64
Run Code Online (Sandbox Code Playgroud)
我很惊讶我还找不到关于此的重复问题。我想我的回答与手册中的常见问题解答略有不同,因为这是常见的第一个问题。 哎呀,我不知何故错过了:阶乘函数在 Python 中工作,对于 Julia 返回 0
想象一下,您已经学过加法和乘法,但从未学过任何大于 99 的数字。就您而言,比这更大的数字根本不存在。因此,您学会了将 1 进位到十列,但您甚至不知道将 10 进位到的列叫什么。所以你只要把它们扔掉就可以了。只要你的数字永远不会超过 99,一切都会好起来的。一旦超过 99,就会回滚到 0。所以 99+3 \xe2\x89\xa1 2 (mod 100)。和 52*9 \xe2\x89\xa1 68 (mod 100)。每当您进行两个以上 10 因数的乘法时,您的答案都将为零:25*32 \xe2\x89\xa1 0 (mod 100)。现在,在你完成每一次计算之后,有人可能会问你“你超过了 99 了吗?” 但这需要时间来回答\xe2\x80\xa6,而这些时间可以用来计算你的下一个数学问题!
\n\n这实际上是计算机本身进行算术运算的方式,只不过它们以 64 位的二进制方式进行算术运算。您可以使用以下函数查看各个位bits:
julia> bits(45)\n"0000000000000000000000000000000000000000000000000000000000101101"\nRun Code Online (Sandbox Code Playgroud)\n\n当我们将其乘以 2 时,101101将向左移动(就像乘以十进制的 10 一样):
julia> bits(45 * 2)\n"0000000000000000000000000000000000000000000000000000000001011010"\njulia> bits(45 * 2 * 2)\n"0000000000000000000000000000000000000000000000000000000010110100"\njulia> bits(45 * 2^58)\n"1011010000000000000000000000000000000000000000000000000000000000"\njulia> bits(45 * 2^60)\n"1101000000000000000000000000000000000000000000000000000000000000"\nRun Code Online (Sandbox Code Playgroud)\n\n\xe2\x80\xa6 直到它开始从末端脱落。如果您将超过 64 个 2 相乘,结果将始终为零(就像在上面的示例中将两个以上的十相乘一样)。我们可以询问计算机是否溢出,但默认情况下对每个计算都这样做会产生一些严重的性能影响。所以在 Julia 中你必须明确。您可以要求 Julia 在特定乘法后进行检查:
\n\njulia> Base.checked_mul(45, 2^60) # or checked_add for addition\nERROR: OverflowError()\n in checked_mul at int.jl:514\nRun Code Online (Sandbox Code Playgroud)\n\n或者您可以将参数之一提升为 BigInt:
\n\njulia> bin(big(45) * 2^60)\n"101101000000000000000000000000000000000000000000000000000000000000"\nRun Code Online (Sandbox Code Playgroud)\n\n1在您的示例中,您可以看到当您使用大整数算术时,答案后面跟着 81 个零:
julia> bin(big(2) ^ 3 ^ 4)\n"1000000000000000000000000000000000000000000000000000000000000000000000000000000000"\nRun Code Online (Sandbox Code Playgroud)\n\n有关更多详细信息,请参阅常见问题解答:为什么 julia 使用本机机器整数运算?
\n