[Примечание:. Я игнорирую бесконечности и пренебрежим малый в этом ответе, либо как тривиально приводит к неэквивалентности]
Если вы отключили субнормальных номера (или вровень нулю поведение) , тогда можно создать недочет с вычитанием, что приведет к неэквивалентности между вашими двумя выражениями.
Например:
#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. Тем не менее, допустимо иметь реализацию с плавающей запятой, которая вообще не имеет субнормальных значений, и на таких системах не требуется магии для достижения такой же неэквивалентности.
@Paul R: случаи NaN теперь исключены (см. Правки выше), поэтому мой вопрос больше связан с «нормальными» числами с плавающей запятой. – zell
Почему downvote ?? – zell
Единственный случай, который имеет значение NaN, - это 'x == y', и оба являются бесконечностью. – tmyklebu