2013-10-08 4 views
-1

Это выражение:Является ли это действительным выражением java?

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

Все переменные имеют double типа. Из кода должно быть ясно, что я пытаюсь сравнить. Я всегда предполагал, что это будет правильно в java, поскольку компилятор никогда не показывает никаких ошибок. But I recently read here, что я не должен использовать == для сравнения чисел с плавающей запятой. Это верно для других реляционных операторов? Если меня не волнует NaN, могу ли я использовать встроенные операторы связи вместо функций Double или Float?

Могу ли я использовать выражение, показанное ниже?

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?

+0

Возможно, вы только что отправили свое наблюдение. –

+0

вы пытаетесь использовать их? Были ли у вас какие-либо проблемы при их использовании? – SudoRahul

+0

хорошо, кажется, все в порядке. Это просто часть более длинного кода, и NaN по какой-то причине распространяется внутри кода , поэтому просто пытаюсь убедиться, что это не проблема. – user13267

ответ

0

Действительно ли это? Да. Он будет компилироваться и запускаться. Однако, когда вы читаете в этом вопросе, когда вы начинаете сравнивать очень близкие числа, вы можете получить ошибку округления, и ошибка округления может быть немного непредсказуемой время от времени. Это вызывает большие проблемы с точным равенством (как вы читаете), но также может вызывать проблемы, когда вы начинаете сравнивать очень близкие поплавки (хотя это менее вероятно).

0

Как указано в Q & А что вы связаны, в связи с крайними случаями с двойной NaN и т.п., то лучше использовать double.Compare()

+0

Для многих приложений на самом деле лучше использовать операторы сравнения. Как правило, не требуется, чтобы «Double.NaN» тестировался как равный самому себе. То же самое касается «Double.POSITIVE_INFINITY» и «Double.NEGATIVE_INFINITY». –

+0

Операторы сравнения не обрабатывают подписанные нули. 0d == -0d = true. –

+0

Я не рекомендую использовать оператор равенства '==' для значений с плавающей запятой. Однако для многих приложений 0d и -0d _should_ считаются равными. Операторы сравнения ('<', '<=' и т. Д.) Обрабатывают подписанные нули; они просто делают это иначе, чем 'Double.compare'. Время, когда вы абсолютно должны использовать 'Double.compare', - это когда вам нужна согласованность с' equals() '(например, при использовании их в качестве ключей к' HashMap'). –

0

Реляционные операторы, как правило, безопасны для использования. Проблема с == заключается в том, что очень малые ошибки округления приведут к тому, что числа, которые, как можно думать, равны тестированию как не равные. Когда вы хотите, проверка на равенство, то лучше использовать что-то вроде:

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

где TOLERANCE это сумма ошибки округления вы хотите игнорировать. (Вы можете также использовать относительное количество — TOLERANCE * a, например.

Вы можете использовать Double.compare и проверить, является ли оно положительным, отрицательным или 0, но это, как правило, нет необходимости, и во многих случаях может быть неправильно. Для Например, Double.compare(Double.NaN, Double.NaN) будет возвращать 0 (означая равный), когда вы обычно хотите обрабатывать NaN как не равную чему-либо (включая себя). То же самое относится к плюсам и минусам бесконечности.

Смежные вопросы