Gary Gong

2 minute read

ISEQUAL()==

本執行環境:Julia 1.0

在 Julia 裡面,isequal()==表面上看起來都是比較兩者是否相等;但其實裡面還是有些微的差距:isequal(a, b)隱含著hash(a)hash(b)是否相等。在浮點數(包含NaN)、遺失值(Missing)中,兩者處理狀況有差距。根據文件所述,isequal會視0.0-0.0為不同,NaN永遠與其他NaN相同,missing也是。

isequal() 文件:https://docs.julialang.org/en/v1/base/base/#Base.isequal

== 文件:https://docs.julialang.org/en/v1/base/math/#Base.:==

比較

正零與負零

指令 結果? 指令 結果?
isequal(0.0, -0.0) false 0.0 == -0.0 true
isequal(0, -0) true 0 == -0 true
isequal(0.0, -0) true 0.0 == -0 true
julia> hash(0)
0x77cfa1eef01bca90
julia> hash(-0)
0x77cfa1eef01bca90
julia> hash(0.0)
0x77cfa1eef01bca90
julia> hash(-0.0)
0x3be7d0f7780de548

MISSING 們

指令 結果? 指令 結果?
isequal(missing, missing) true missing == missing missing
isequal(Missing, Missing) true Missing == Missing true
isequal(missing, Missing) false missing == Missing missing
isequal(missing, 3) false missing == 3 missing
julia> typeof(missing)
Missing
julia> typeof(Missing)
DataType

NAN 們

指令 結果? 指令 結果?
isequal(NaN, NaN) true NaN == NaN false
isequal([1 NaN], [1 NaN]) true [1 NaN] == [1 NaN] false
isequal(NaN, NaN32) true NaN == NaN32 false
julia> hash(NaN)
0x15d7d083d04ecb90
julia> hash(NaN16)
0x15d7d083d04ecb90
julia> hash(NaN32)
0x15d7d083d04ecb90
julia> hash(NaN64)
0x15d7d083d04ecb90

不管哪一種NaNhash 值都一樣;同樣出現在Inf中,不管是Inf16Inf32Inf64皆為0x807bb202c9cbfc6f,而負無限大者皆為0x96e782fc7639e1bc

由於系統是 64 位元,NaNDataTypeFloat64

複數(COMPLEX NUMBER)們

指令 結果? 指令 結果?
isequal(3/(4*im), 3/4im) true 3/(4*im) == 3/4im true
isequal(-(3/4*im), 3/4im) false -(3/4*im) == 3/4im true
isequal(-(3/4im), 3/4*im) false -(3/4im) == 3/4*im true
isequal(-1+0im, -1) true -1+0im == -1 true
julia> 3/(4*im)
0.0 - 0.75im
julia> 3/4im
0.0 - 0.75im
julia> -(3/4*im)
-0.0 - 0.75im
julia> -(3/4im)
-0.0 + 0.75im

很明顯的因為 -0.0 的出現,導致第二個 row 前者為 false 後者為 true

前兩者3/(4*im)3/4im表現像為 $$ \begin{aligned} \frac{3}{(4i)} = \frac{3}{4i} &=\frac{3i}{4i*i}\newline &=-\frac{3i}{4}\newline &=0-0.75i \end{aligned} $$ 雖然-(3/4im)表現像是: $$ \begin{aligned} -(\frac{3}{4i}) &=-(\frac{3i}{4i*i})\newline &=-(-\frac{3i}{4})\newline &=0.75i \end{aligned} ​ $$

-(3/4*im)的表現卻像是: $$ \begin{aligned} -(\frac{3}{4}i) &=-0.75i \end{aligned} $$ 根據文件指出,這是因為係數卡重要啦(Note that 3/4im == 3/(4*im) == -(3/4*im), since a literal coefficient binds more tightly than division.)

所以說,3/4*im就會像是:

julia> 3/4*im
0.0 + 0.75im

這個*一擺上去 $i$ 與分數從此天人永隔。

有理數(RATIONAL NUMBER)們

指令 結果? 指令 結果?
isequal(1/2, 1//2) true 1/2 == 1//2 true
isequal(1/3, 1//3) false 1/3 == 1//3 false
isequal(1/4, 1//4) true 1/4 == 1//4 true
isequal(1/5, 1//5) false 1/5 == 1//5 false
isequal(1/6, 1//6) false 1/6 == 1//6 false
isequal(1/7, 1//7) false 1/7 == 1//7 false
isequal(1/8, 1//8) true 1/8 == 1//8 true
isequal(1/16, 1//16) true 1/16 == 1//16 true

這似乎是分母為 $2$ 的次方就會使得兩者相等

那當然如果說在Rational Number(也就是說這個東西://)的地方加上float()就會使此兩者相等,這就沒有問題,例如:

julia> isequal(1/5, float(1//5))
true
julia> 1/5 == float(1//5)
true
julia> isequal(1/3, float(1//3))
true
julia> 1/3 == float(1//3)
true

當然,零的部分要按上面的規則來:

julia> isequal(0/3, -float(0//3))
false
julia> 0/3 == -float(0//3)
true
julia> isequal(float(0/3), -float(0//3))
false
julia> float(0/3) == -float(0//3)
true
julia> float(0/3)
0.0
julia> -float(0//3)
-0.0

也看看

NGINX, MYSQL, PHP INSTALLATION (UBUNTU 16.04)

Cannot Use pip3 in macOS (zlib Dependency Problem)

ZZZ我終於把 MATHJAX 弄進去了

Hexo Syntax Highlighting (Tested Under Tranquilpeak)

comments powered by Disqus