0

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は指定されたイプシロン値です。
ありがとう。

4

2 に答える 2

10

-0.0IEEE 754標準で指定されているように、は負のゼロです。

このような値がどのように発生するかについて知りたい場合は、次の記事で説明できます。http: //www.savrola.com/resources/negative_zero.html

イプシロン値をとらないことに関しては、これFloat.compareが設計方法です(これは正確な比較であり、概算ではありません)。イプシロンを取得し近似比較を実行する別の比較関数を使用することを妨げるものは何もありません

浮動小数点数の正確な比較と近似的な比較の両方に用途があります。

実際のコードに関しては、いくつかの問題があります。

  1. Float.compare;のような3者間比較ではありません。
  2. NaNsを処理しません。
  3. 一般に、イプシロンを絶対値ではなく相対値として指定して、andに比例するようにすることをお勧めしますf1f2説明については、この記事を参照してください)。

ここでの私のポイントは、コードを批判することではなく、優れた浮動小数点コードを作成することが最初の見た目よりも難しいことを示すことです。

于 2011-08-04T12:10:50.297 に答える
3

浮動小数点演算はトリッキーです。この記事では、基本に光を当てます。

-0 は符号付きゼロです:

通常の算術では、−0 = +0 = 0 です。ただし、計算では、2 つのゼロの存在を許容する数値表現があり、多くの場合、−0 (負のゼロ) と +0 (正のゼロ) で示されます。
[...]
浮動小数点演算の IEEE 754 標準 (現在、浮動小数点数をサポートするほとんどのコンピューターとプログラミング言語で使用されています) では、+0 と -0 の両方が必要です。ゼロは、1/−0 = −∞ および 1/+0 = +∞、ゼロによる除算は ±0/±0 および ±∞/±∞ に対してのみ定義されていないような、拡張実数直線の変形と見なすことができます。 .

于 2011-08-04T12:13:34.290 に答える