理解juliaint溢出行为

理解juliaint溢出行为,julia,Julia,来自Python/Matlab背景,我想更好地理解Julia的Int64溢出行为是如何工作的 从: 在Julia中,超过给定类型的最大可表示值 结果导致一种概括的行为 现在,我用明显大于typemax(Int64)的数字做了一些实验,但我看到的行为与文档不一致。似乎事情并不总是那么简单。只允许一次环绕吗 julia> x = (10^10)^(10^10) 0 julia> x = 10^10^10^10 1 # ?? julia> x = 10^10^10^10^10

来自Python/Matlab背景,我想更好地理解Julia的Int64溢出行为是如何工作的

从:

在Julia中,超过给定类型的最大可表示值 结果导致一种概括的行为

现在,我用明显大于typemax(Int64)的数字做了一些实验,但我看到的行为与文档不一致。似乎事情并不总是那么简单。只允许一次环绕吗

julia> x = (10^10)^(10^10)
0
julia> x = 10^10^10^10 
1   # ??

julia> x = 10^10^10^10^10  
10  # I'd expect it to be 1? 1^10 == 1?

julia> x = 10^10^10^10^10^10 
10000000000  # But here 10^10 == 10000000000, so now it works?


julia> typemax(Int64) > 10^19
true
julia > typemax(Int64) > -10^19
true
有人能解释我看到的行为吗

编辑:

为什么9正确溢出,而10不正确

julia> 9^(10^14)
-1193713557845704703
julia> 9^(10^15)
4900281449122627585
julia> 10^(10^2)
0
julia> 10^(10^3)
0

Julia 0.5.0(2016-09-19)

您看到的是PEMDAS操作顺序的结果,特别是求幂部分之前的括号。这实际上成为这些表达式从右向左的求解

julia> 10^(10^10) #happens to overflow to 0
0

julia> 10^(10^(10^10)) # same as 10 ^ 0
1

julia> 10^(10^(10^(10^(10^10)))) # same as x = 10^(10^(10^(10^(10000000000)))) -> 10^(10^(10^(0))) -> 10^(10^(1)) -> 10^ 10
10000000000

因此,这实际上只是一个通过算术工作的问题。或者意识到您将要进行如此大规模的操作,以至于从一开始就开始使用BigInt。

谢谢您的回答。这很有道理。然而,为什么10^(10^10)溢出到0,而不是简单地环绕?10^(10^11)也会溢出到0。如果你试着9^(10^14),9^(10^15),你会看到事情像它们应该的那样缠绕着。@dangom它确实缠绕着
10^10^10
2^64
的倍数,因此恰好环绕到
0
。偶数的任何大指数也会发生同样的情况,比如
6^666
14^5^5
@FengyangWang。我没想到会这样。谢谢你的评论@dangom想用素数(10=2 x 5)来扩展一切,以得到你的答案。
julia> 10^(10^10) #happens to overflow to 0
0

julia> 10^(10^(10^10)) # same as 10 ^ 0
1

julia> 10^(10^(10^(10^(10^10)))) # same as x = 10^(10^(10^(10^(10000000000)))) -> 10^(10^(10^(0))) -> 10^(10^(1)) -> 10^ 10
10000000000