私は二倍の配列を平等のスカラー倍と比較しようとしていますが、特定の状況では平等は決して認識されません。私はこれが二重表現の方法(例えば1.0対1.0)と関係があると考えていますが、私はそれを理解することはできません。 Iが10.2(または10.2000)に等しいかどうかをテストする場合例えばmatlab double comparison
、私は二重の値の数千からなるアレイを生成し、最後の数は、そのうちのいくつかの瞬間に時間的に
10.6000
-11.0000
10.2000
22.6000
3.4000
によって与えられます。コマンド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)
)を使用して比較の失敗を修正できますが、これは不満足なようです。
編集:配列内の値は、定数倍(例えば、0.2
)の反復的な加算または減算によって生成されます。したがって、この配列の弾性率は、0.2
はどこでも0
に等しくなければなりません。
mod(array,0.2)
...
0.2000
0
0.2000
0.2000
0
再び値を手動アレイおよびモジュラスに配置された場合、:アレイ内の数字の上記のシーケンスのために以下に示すように、実際には、各要素の弾性率は、0
又は0.2
のいずれかに等しいです。全ての期待値が得られる。
非常に役に立ちます。 1つのフォローアップの質問は、私の数値がループ内の多くのサイクルにわたって一定量(例えば '0.2')を加算または減算することによって生成されたので、配列の数値は、modulo 0.2(' mod(array 、0.2) ')が適用される。実際、彼らはそうではありません。それらは0または0.2のいずれかに等しい。もちろん、配列の数値のいずれかにモジュロ0.2を手動で入力すると、期待値0が与えられます。あなたはこの行動を説明できますか?ありがとう! – user001
これは、浮動小数点数がどのようにコンピュータに表示されるかを示します。よく知られている事実は、コンピュータが10進ではなくバイナリを使用することです。しかしながら、バイナリ、すなわち有限小数である問題があり、例えば小数点以下で0.2を2進数で有限桁で表すことはできない。つまり、コンピュータの0.2の2進表現は実際には0.001110011100111 ...です。これは無限です。ただし、MATLABは64ビットを使用して「Single」を表し、これは2 ^( - 65)の誤差を引き起こします。このエラーはかなり小さいですが、かなりの反復があると、それが蓄積する可能性があります。 – grapeot
すばらしい説明。どうもありがとうございます。 – user001