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
不管哪一種NaN
hash 值都一樣;同樣出現在Inf
中,不管是Inf16
、Inf32
、Inf64
皆為0x807bb202c9cbfc6f
,而負無限大者皆為0x96e782fc7639e1bc
。
由於系統是 64 位元,NaN
的DataType
為Float64
複數(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
Share this post
Twitter
Google+
Facebook
Reddit
LinkedIn
Pinterest
Email