Float.compare(f1、f2)をチェックすると、f1f2
を比較し、-1,0,1を返すことがわかりました。
次に、値が-0.0、0.0、またはNANの場合、-1,0,1を返します。
-0.0とはどういう意味ですか?
私は次のようなものを期待していたでしょう
return (Math.abs(f1 - f2) - 0.001f) > 0)
ここで、0.001は指定されたイプシロン値です。
ありがとう。
Float.compare(f1、f2)をチェックすると、f1f2
を比較し、-1,0,1を返すことがわかりました。
次に、値が-0.0、0.0、またはNANの場合、-1,0,1を返します。
-0.0とはどういう意味ですか?
私は次のようなものを期待していたでしょう
return (Math.abs(f1 - f2) - 0.001f) > 0)
ここで、0.001は指定されたイプシロン値です。
ありがとう。
-0.0
IEEE 754標準で指定されているように、は負のゼロです。
このような値がどのように発生するかについて知りたい場合は、次の記事で説明できます。http: //www.savrola.com/resources/negative_zero.html
イプシロン値をとらないことに関しては、これFloat.compare
が設計方法です(これは正確な比較であり、概算ではありません)。イプシロンを取得し、近似比較を実行する別の比較関数を使用することを妨げるものは何もありません。
浮動小数点数の正確な比較と近似的な比較の両方に用途があります。
実際のコードに関しては、いくつかの問題があります。
Float.compare
;のような3者間比較ではありません。NaN
sを処理しません。f1
(f2
説明については、この記事を参照してください)。ここでの私のポイントは、コードを批判することではなく、優れた浮動小数点コードを作成することが最初の見た目よりも難しいことを示すことです。
浮動小数点演算はトリッキーです。この記事では、基本に光を当てます。
-0 は符号付きゼロです:
通常の算術では、−0 = +0 = 0 です。ただし、計算では、2 つのゼロの存在を許容する数値表現があり、多くの場合、−0 (負のゼロ) と +0 (正のゼロ) で示されます。
[...]
浮動小数点演算の IEEE 754 標準 (現在、浮動小数点数をサポートするほとんどのコンピューターとプログラミング言語で使用されています) では、+0 と -0 の両方が必要です。ゼロは、1/−0 = −∞ および 1/+0 = +∞、ゼロによる除算は ±0/±0 および ±∞/±∞ に対してのみ定義されていないような、拡張実数直線の変形と見なすことができます。 .