-1

これは式です:

if( Math.abs(GH1[i]) < Double.valueOf("1E-100") ){
.
.
.
}  

すべての変数はdouble型です。私が比較しようとしていることは、コードから明らかなはずです。コンパイラもエラーを表示しないため、これは java で正しいと常に想定していました。しかし、最近ここ==で、浮動小数点数の比較に使用してはならないことを読みました。他の関係演算子にも当てはまりますか? が心配でない場合は、または関数 NaNの代わりに組み込みの関係演算子を使用できますか?DoubleFloat

以下の表現は使えますか?

if(GH1[i] < 0.0f)           // if( Double.compare(GH1[i], 0.0f) < 0  )
    tempSign = -1.0f;
else if(GH1[i] == 0.0f)     // else if( Double.compare(GH1[i], 0.0f) == 0 )
    tempSign = 0.0f;
else if(GH1[i] > 0.0f)      // else if( Double.compare(GH1[i], 0.0f) > 0 )
    tempSign = 1.0f;

それとも、Double と Float の関数を使用する必要がありますか?

4

3 に答える 3

0

有効ですか?はい。コンパイルして実行します。ただし、その質問で読んだように、非常に近い数値を比較し始めると、丸め誤差が発生する可能性があり、丸め誤差は時々予測できない場合があります。これにより、(読み取りのように) 完全に等しいという大きな問題が発生しますが、非常に近い float を比較し始めるときにも問題が発生する可能性があります (可能性は低いですが)。

于 2013-10-08T04:37:12.480 に答える
0

関係演算子は、一般的に安全に使用できます。問題==は、非常に小さな丸め誤差によって、等しいと思われる数値が等しくないとしてテストされることです。等価性テストが必要な場合は、次のようなものを使用するのが最善です。

if (Math.abs(a - b) < TOLERANCE) { . . . }

ここTOLERANCEで、無視したい丸め誤差の量です。TOLERANCE * a(たとえば、相対量を使用することもできます。

正、負、または 0 かどうかを使用Double.compareしてテストできますが、それは一般的に不要であり、多くの場合、間違っている可能性があります。たとえば、通常、 (それ自体を含む) 何にも等しくないものとしてDouble.compare(Double.NaN, Double.NaN)扱いたい場合、 は 0 (等しいことを意味する) を返します。NaNプラス無限大、マイナス無限大も同様です。

于 2013-10-08T04:55:18.027 に答える
0

リンクしたQ&Aに記載されているように、二重NaNなどのエッジケースのため、使用するのが最善ですdouble.Compare()

于 2013-10-08T04:45:02.903 に答える