2013-11-09 1 views
0

Я знаю, что сравнение чисел с плавающей запятой с равенством - плохая идея. Мой вопрос: безопасно ли сравнивать числа, исходящие из одного и того же вычисления. Например. (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?

Извините, если раньше был дан ответ, я не смог найти ответ.

+1

C определенно не гарантирует этого. Один может быть в регистре, а другой может быть в памяти, который может использовать разные префиксы. –

+0

@DavidSchwartz: C требует, чтобы присвоение было округлено до номинального типа адресата. С помощью дополнительной точности можно вычислять только промежуточные значения. –

ответ

2

Как Java, так и C требуют, чтобы присваивание преобразовывало назначенное значение в тип назначения без дополнительной точности или диапазона. Дальнейшее простое назначение тогда не может изменить значение.

В Java это указано в 5.1.13 (Преобразование значений) и 5.2 (Преобразование присваивания).

В C 2011 (N1570), это упоминается в 5.2.4.2.2 9.

+0

Благодарим вас за ссылки –

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