为什么Julia中的2^3^4=0?

为什么Julia中的2^3^4=0?,julia,Julia,我刚读了一篇来自Quora的帖子: 在底部,有一个答案是: 2 ^ 3 ^ 4 = 0 我自己也试过: julia> 2 ^ 3 ^ 4 0 个人而言,我不认为这是语言中的一个错误。为了清楚起见,我们可以为Julia和我们的人类添加括号: julia> (2 ^ 3) ^ 4 4096 到目前为止还不错;但是,这不起作用: julia> 2 ^ (3 ^ 4) 0 因为我在学习,我想知道Julia如何将这个表达式计算为0?评估先例是什么 julia> typeo

我刚读了一篇来自Quora的帖子:

在底部,有一个答案是:

2 ^ 3 ^ 4 = 0
我自己也试过:

julia> 2 ^ 3 ^ 4
0
个人而言,我不认为这是语言中的一个错误。为了清楚起见,我们可以为Julia和我们的人类添加括号:

julia> (2 ^ 3) ^ 4
4096
到目前为止还不错;但是,这不起作用:

julia> 2 ^ (3 ^ 4)
0
因为我在学习,我想知道Julia如何将这个表达式计算为0?评估先例是什么

julia> typeof(2 ^ 3 ^ 4)
Int64
我很惊讶我还没有找到一个关于这个的重复问题。我想我的回答会稍微不同,因为这是一个常见的第一个问题。哎呀,我不知怎么错过了:

想象一下,你学过加法和乘法,但从未学过任何大于99的数字。就你而言,比这更大的数字根本不存在。所以你学会了把一个带进十个列,但你甚至不知道把十个带进的列叫什么。所以你就把它们扔了。只要你的数字永远不会超过99,一切都会很好。一旦你超过99,你回到0。所以99+3≡ 2(模块100)。和52*9≡ 68(模块100)。任何时候你用两个以上的10的因子做乘法,你的答案都是0:25*32≡ 0(模块100)。现在,在你做每一次计算后,有人可能会问你“你超过99了吗?”但这需要时间来回答…计算你下一道数学题的时间

这就是计算机本机执行算术的有效方式,但它们是以64位二进制执行的。您可以使用
bits
功能查看各个位:

julia> bits(45)
"0000000000000000000000000000000000000000000000000000000000101101"
当我们将其乘以2时,
101101
将向左移动(就像在十进制中乘以10):

…直到它开始从末端脱落。如果您将64个以上的2乘在一起,答案将始终为零(就像上面示例中将两个以上的10乘在一起一样)。我们可以询问计算机是否溢出,但在默认情况下,对于每一次计算,这样做都是错误的。所以在朱莉娅身上,你必须明确。您可以要求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"

有关更多详细信息,请参阅常见问题解答:

2^3^4=2^81>2^64
(如果结果是
Int64
),因此您似乎有整数溢出。2^81=10..0(81零)最后64位是零可能是啊的重复,你的解释真的很好。我只在quora的帖子中注意到
Matlab
可以做得很好(正如你引用的帖子中的人只注意到
python
可以做得很好),而没有考虑太多的大数字溢出。我在想,如果Matlab,Python能做得对,为什么Julia不能?--这是错误的。非常感谢你!Matlab通过在默认情况下使用浮点数并在其显示中舍入来解决这个问题。如果你真的使用整数,你会大吃一惊。尝试
int64(2)^(3^4)
。是的,这个matlab计算让我很惊讶<代码>>>int64(2)^(3^4)ans=9223372036854775807大整数和浮点数通常是陷阱!
julia> bin(big(2) ^ 3 ^ 4)
"1000000000000000000000000000000000000000000000000000000000000000000000000000000000"