2016-08-24 31 views
5

wiem podwójne nie powinny być porównywane bezpośrednio przez operatora ==, ale co jeśli ja określić wartość początkową jako 0.0 np:Jeśli podwójne a = 0.0, czy mogę porównać * b == 0 bezpośrednio?

double a=0.0; 
double b= 
. 
. 
. 

Jeśli nie jest modyfikowany, robi a * b == 0 Zawsze prawdziwe?

+0

Czy próbowałeś napisać test (jUnit) i zweryfikować siebie? –

+0

Może być powiązany: http://stackoverflow.com/questions/21005444/double-comparison-to-zero-special-case?rq=1 FWIW, mnożenie przez 0 spowoduje, że wynik * dokładnie * 0 (brak błędów zaokrąglania lub nieścisłości). – Thilo

Odpowiedz

4

wiem podwójne nie powinny być porównywane przez operatora bezpośredniego

== To jest tylko prawda, jeśli nie wiem, ile reprezentacja lub zaokrąglania błąd. Klasycznym przykładem tego, co nie do zrobienia jest

0.1 + 0.2 == 0.3 // false :(

Jednak jeśli używasz zaokrąglania jak

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

z 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; 
} 

Jeśli nie jest modyfikowany, robi * b == 0 zawsze prawda?

Jest przeznaczony dla liczb skończonych. Dla nieskończoności i NaN otrzymasz NaN i nie jest to równe cokolwiek.

4

Pomnożenie przez 0.0 spowoduje 0.0 (dokładnie brak błędów zaokrąglania lub innych niedokładności - o ile nie dotyczy to nieskończoności lub NaN).

Ale jeśli skończysz z 0.0 lub coś podobnego do 0.0 po arbitralnych operacji, nie możesz być pewien, czy to naprawdę (matematycznie) 0, i powinien używać epsilon.