==演算子を使用して2つの丸められた浮動小数点数を比較するのは正しいですか?
-
04-07-2019 - |
質問
または、操作が失敗する可能性はありますか?
ありがとう。
間違った用語を選択しましたが、実際の意味は切り捨てではなく0に丸めることでした。
要点は、2つのdoubleの整数部分を比較する必要があり、それらをintにキャストしてから==を使用するだけですが、以前の質問のいずれかで指摘されたように、これはオーバーフローをスローする可能性がありますdoubleが整数に収まらない場合は例外です。
だから質問は、「==演算子を使用して、以前に0に丸められた2つのdoubleを比較するのは正しいのでしょうか、それともintメソッドにキャストして、例外をキャッチする必要がありますか?
解決
更新されたサイトはこちら浮動小数点数を比較するいくつかの方法の長所と短所について説明します。 (古いサイトはこちら。)
使用する方法は、「相対エラー」です。方法。 2つの数値の差を見つけ、それを数値の割合に変換します。その割合が十分に小さければ、平等です。
他のヒント
さらに悪いことに、まったく同じ数であっても、失敗する場合があります。これは、一部のコンパイラまたはプロセッサが、メモリよりもCPUレジスタでより多くの精度のビットを使用するためです(たとえば、MSVCには3つの異なる浮動小数点動作オプションがあります)。したがって、最近計算された値はこれらのビットが切り捨てられていない場合があり、等しくないように見えます。浮動小数点数で==を使用しないでください。
浮動小数点表現の通常の問題により、依然として失敗する可能性があります。それらを切り捨てるのではなく、同等の精度を表すデルタを使用します。
通常は同じと考える2つのフロートがある場合、失敗する可能性があります
10.19999999
10.20000001
ただし、切り捨てると、異なる結果が得られます。
10.19
10.20
一方、0.001のデルタを使用して差異を比較した場合、これら2つの値は事実上同じであることがわかりました。
浮動小数点で ==
を使用することは決して正しくありません。
「切り捨て」とは浮動小数点コンテキストでの意味?どの特定のライブラリ関数を呼び出していますか?結果は何ですか? 「切り捨てられた」と思わせる理由値は切り捨てられていない値と比較できますか?
浮動小数点は、小数値の近似値です。浮動小数点は、正確に2のべき乗のみを表すことができます。他のすべての値は、浮動小数点演算の種類にかかわらず、何らかのエラーの影響を受けます。
ただし、整数に変換する場合は、 ==
を使用できます。
absolut値がsingleの場合2 ^ 23未満、doubleの場合2 ^ 52未満の場合、round()を使用して比較を実行できます。 大きな値を正確に保存することはできません。これは、N == N + 1の状況で開きます。