我想比較一個雙精度數組爲平等,但在某些情況下永遠不會識別平等。我懷疑這與雙倍體現的方式有關(例如1.0比1.00),但我無法弄清楚。matlab雙比較
例如,我已經產生的數千雙值組成的陣列,最後幾個其中的某時刻在時間上由
10.6000
-11.0000
10.2000
22.6000
3.4000
給出。如果我測試相等10.2(或10.2000)通過命令array==10.2
(或array=10.2000
),我返回一個0的數組。如果我手動將所顯示的值放入數組中(例如,array=[10.6000 -11.0000 10.2000 22.6000 3.4000]
),則該命令成功(即,array==10.2
返回0 0 1 0 0
)。有人可以解釋爲什麼如果我手動輸入值相等成功,但如果數組是在程序的上下文中生成失敗?我可以通過使用近似值而不是精確比較來糾正比較失敗(例如,(array<10.20001) & (array>10.19999)
),但這似乎並不令人滿意。
編輯:數組中的值是通過迭代加或減一個常數double(例如,0.2
)生成的。因此該陣列的模數0.2
因此應該在任何地方都等於0
。事實上,每個元件的彈性模量等於或者0
或0.2
,如下所示爲數字的陣列中的上述序列:
mod(array,0.2)
...
0.2000
0
0.2000
0.2000
0
再次,如果值被放置在手動一個陣列和所述模數取得所有0
s的期望值。
非常有幫助。一個後續問題是我的數字是通過在一個循環中的許多循環上增加或減少一個常量(例如,'0.2')而產生的,所以在數學上,當以0.2爲模時,數組中的數字應該等於0('mod(array ,0.2)')。事實上,他們不是。它們等於0或0.2。當然,當我通過手動輸入數組的方式對數組中的任何數進行模0.2運算時,給出的期望值爲0。你能解釋這種行爲嗎?謝謝! – user001
這涉及如何在計算機中表示浮點數。衆所周知的事實是計算機使用二進制而不是十進制。然而,二進制問題即有限分數,例如十進制0.2,不能用二進制有限數字表示。也就是說,計算機中0.2的二進制表示實際上是0.001110011100111 ...,這是無止境的。但是,MATLAB使用64位來表示「Single」,這可能會導致2 ^( - 65)的錯誤。這個錯誤是相當小的,但是當有很多迭代時,它可能會累積。 – grapeot
精彩的解釋。非常感謝。 – user001