2016-09-30 102 views
4

來自Python/Matlab背景,我想更好地瞭解Julia的Int64溢出行爲如何工作。瞭解Julia Int溢出行爲

documentation

在利亞,超過給定類型 導致環繞行爲的最大可表示值。現在

julia> x = typemax(Int64) 
9223372036854775807 

julia> x + 1 
-9223372036854775808 

,我做了一些實驗用數字明顯高於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 

朱莉婭0.5.0(2016年9月19日)

回答

5

你看到什麼操作的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來執行這麼大的操作。

+0

感謝您的回答。這很有道理。然而爲什麼10 ^(10^10)會溢出到0,而不是簡單地迴繞? 10 ^(10^11)也會溢出到0.如果你嘗試9 ^(10^14),9 ^(10^15),你會看到事情在他們應該繞過的地方。 – dangom

+3

@dangom它環繞。 '10^10^10'是'2^64'的倍數,所以恰好包圍爲'0'。偶數的任何大指數都會發生同樣的情況,如「6^666」或「14^5^5」。 –

+0

@FenggyangWang的確。我不會期待這一點。感謝您的評論。 [10^100是2^64的倍數](https://www.wolframalpha.com/input/?i=is+10%5E100+a+multiple+of+2%5E64) – dangom