2014-10-18 6 views
2

Предположим, что x, y - два числа с плавающей запятой. Тогда это правда:Являются ли x <= y и x-y <= 0 эквивалентными в арифметике с плавающей запятой?

x<=y <==> x-y<=0 

в арифметике с плавающей запятой?

Благодарим за ваши идеи.

[Изменить] Предположим дополнительно, что ни x, ни y не являются NaN.

Это возможно, что х = у < справедливо, но не х-у < = 0 или х-у < = 0 имеет место, но не х < = у.

+0

@Paul R: случаи NaN теперь исключены (см. Правки выше), поэтому мой вопрос больше связан с «нормальными» числами с плавающей запятой. – zell

+0

Почему downvote ?? – zell

+0

Единственный случай, который имеет значение NaN, - это 'x == y', и оба являются бесконечностью. – tmyklebu

ответ

1

[Примечание:. Я игнорирую бесконечности и пренебрежим малый в этом ответе, либо как тривиально приводит к неэквивалентности]

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

Например:

#include <stdio.h> 
#define CSR_FLUSH_TO_ZERO (1 << 15) 

// Note: GCC-specific 
void disable_ftz(void) { 
    unsigned csr = __builtin_ia32_stmxcsr(); 
    csr |= CSR_FLUSH_TO_ZERO; 
    __builtin_ia32_ldmxcsr(csr); 
} 

int main(void) { 
    disable_ftz(); 

    float x = 2.8e-45; 
    float y = 1.4e-45; 

    printf("%e\n", x);   // 2.802597e-45 
    printf("%e\n", y);   // 1.401298e-45 

    printf("%d\n", x <= y);  // 0 
    printf("%d\n", (x-y) <= 0); // 1 
    return 0; 
} 

Обратите внимание, что это требует некоторого компилятора конкретной магии на х86. Тем не менее, допустимо иметь реализацию с плавающей запятой, которая вообще не имеет субнормальных значений, и на таких системах не требуется магии для достижения такой же неэквивалентности.

+2

Очевидно, что для вычитания недостаточно для вычитания, если у вас есть постепенное переполнение; это точка постепенного падения. – tmyklebu

+0

@tmyklebu: Конечно, но «постепенное переполнение» (AKA denormals) имеет свои пределы. Конечно, единственный способ создать число, которое меньше наименьшей денормальности, состояло бы в том, чтобы «x» и «y» отличались этим значением, что невозможно :) –

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