6

または、操作が失敗する可能性はありますか?

ありがとう。

私は間違った用語を選択しました。私が本当に意味していたのは、切り捨てではなく、0 への丸めでした。

ポイントは、2 つの double の整数部分を比較する必要があり、それらを int にキャストしてから == を使用するだけですが、以前の質問の 1 つで誰かが指摘したように、これはオーバーフロー例外をスローする可能性があるということです。 double は整数に収まりません。

したがって、質問は、「== 演算子を使用して、以前に 0 に丸められた 2 つの double を比較するのは正しいですか、それとも int メソッドへのキャストに固執して、考えられる例外をキャッチする必要がありますか?」

4

6 に答える 6

12

これは、浮動小数点数を比較するいくつかの方法の長所と短所について説明している更新されたサイトです。旧サイトはこちらからご覧いただけます。)

私が使う方法は「相対誤差」法です。2 つの数値の差を求め、それを数値のパーセンテージに変換します。そのパーセンテージが十分に小さければ、等しいと言えます。

于 2008-10-25T14:06:35.757 に答える
5

さらに悪いことに、まったく同じ数であっても、失敗することがあります。これは、一部のコンパイラまたはプロセッサがメモリよりも CPU レジスタでより多くの精度ビットを使用するためです (たとえば、MSVC には 3 つの異なる浮動小数点動作オプションがあります)。したがって、最近計算された値では、これらのビットが切り捨てられず、等しくないように見える場合があります。フロートに == を使用しないでください。

于 2009-03-13T21:48:27.307 に答える
4

浮動小数点表現の通常の問題により、まだ失敗する可能性があります。それらを切り捨てるのではなく、同等の精度を表すデルタを使用してください。

通常は同じと見なされる 2 つのフロートがある場合、失敗する可能性があります。

10.19999999

10.20000001

しかし、それらを切り捨てると、異なる結果が得られます。

10.19

10.20

一方、差を比較するために 0.001 のデルタを使用した場合、これら 2 つの値は事実上同じであることがわかります。

于 2008-10-25T13:58:32.890 に答える
2

==浮動小数点での使用は決して正しくありません。

浮動小数点コンテキストで「切り捨て」とはどういう意味ですか? どの特定のライブラリ関数を呼び出していますか? 結果は?「切り捨てられた」値が切り捨てられていない値よりも同等であると信じる理由は何ですか?

浮動小数点は、10 進数値の近似値です。浮動小数点は、正確に 2 の累乗しか表現できません。他のすべての値は、実行する浮動小数点演算に関係なく、何らかのエラーが発生する可能性があります。

ただし、整数に変換する場合は、 を使用できます==

于 2008-10-25T14:30:27.900 に答える
1

http://www.windojitsu.com/code/floatcomparer.html

于 2009-10-28T12:32:15.853 に答える
-1

絶対値が single の場合は 2^23 未満、double の場合は 2^52 未満の場合は、round() を使用してから比較を行うことができます。より大きな値は正確に保存できず、これは N == N+1 の状況で発生します。

于 2008-10-25T14:44:02.000 に答える