2016-08-24 7 views
5

私は二重の知っている直接==演算子で比較するべきではありませんが、どのように私は0.0として初期値を定義した場合について例:?double a = 0.0の場合、a * b == 0を直接比較できますか?

double a=0.0; 
double b= 
. 
. 
. 

変更されていない場合は、必ず* bの== 0を行います本当ですか?私は二重の知っている

+0

テスト(jUnit)を作成して自分自身を検証しようとしましたか? –

+0

おそらく関連:http://stackoverflow.com/questions/21005444/double-comparison-to-zero-special-case?rq=1 FWIW、0を乗算すると結果は正確に* 0になります(丸め誤差や不正確さはありません) )。 – Thilo

答えて

4

は、あなたが持っているどのくらいの表現や丸め誤差がわからない場合にのみ、真である

直接==演算子で比較するべきではありません。いけないことの典型的な例は、あなたが変更されていない場合Chronicle Core's Maths

public static double round4(double d) { 
    final double factor = 1e4; 
    return d > WHOLE_NUMBER/factor || d < -WHOLE_NUMBER/factor ? d : 
      (long) (d < 0 ? d * factor - 0.5 : d * factor + 0.5)/factor; 
} 

から

if (round4(0.1 + 0.2) == 0.3) // true 

のように丸め使用している場合は、しかし、

0.1 + 0.2 == 0.3 // false :(

ありません* b == 0は常に真ですか?

これは有限数です。無限大とNaNの場合はNaNが得られますが、これは何と同等ではありません。

4

0.0での乗算は、0.0になります(丸め誤差やその他の不正確さはありません - 無限大またはNaNなどのものが含まれていない限り)。

しかし、0.0または任意の操作後に0.0に近い値になると、実際には(0)かどうかを確認できず、εを使用する必要があります。

関連する問題