Я знаю, что сравнение чисел с плавающей запятой с равенством - плохая идея. Мой вопрос: безопасно ли сравнивать числа, исходящие из одного и того же вычисления. Например. (Java код)Может ли значение изменения присваивания числа с плавающей запятой?
double doSomething(double d) {
return d;
}
void test() {
double result = computation();
double result2 = result;
Double result3 = new Double(result)
Double result4 = new Double(result2)
double result5 = doSomething(result2)
//etc.
//now do all of the above compare equal? i.e.
boolean b = result4.doubleValue() == result //is this true?
//and for other combinations?
}
Кажется, что они должны быть равны, но я не уверен, если это действительно так, потому что регистры FPU. Является ли JVM гарантией того, что они равны? И бонусный вопрос: как насчет C?
Извините, если раньше был дан ответ, я не смог найти ответ.
C определенно не гарантирует этого. Один может быть в регистре, а другой может быть в памяти, который может использовать разные префиксы. –
@DavidSchwartz: C требует, чтобы присвоение было округлено до номинального типа адресата. С помощью дополнительной точности можно вычислять только промежуточные значения. –