假设x,y是两个浮点数。那么是这样的:在浮点运算中x <= y和x-y <= 0等效吗?
x<=y <==> x-y<=0
在浮点算术?
感谢您的意见。
[编辑]另外我们假设x和y都不是NaN
。
这可能是x < = y成立但不是x-y < = 0或x-y < = 0成立但不是x < = y。
假设x,y是两个浮点数。那么是这样的:在浮点运算中x <= y和x-y <= 0等效吗?
x<=y <==> x-y<=0
在浮点算术?
感谢您的意见。
[编辑]另外我们假设x和y都不是NaN
。
这可能是x < = y成立但不是x-y < = 0或x-y < = 0成立但不是x < = y。
[注:我忽略了无穷大和NaN在这个答案,因为无论是平凡导致非等价]
如果您已经停用次正规数(或刷新到零行为) ,那么可能会产生一个带有减法的下溢,导致两个表达式之间不等价。
例如:
#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;
}
注意,这需要在x86一些具体的编译器的魔力。然而,允许有一个根本没有低于正常值的浮点实现,并且在这样的系统上不需要魔术来实现相同的非等价。
如果逐渐下溢,减法显然是不可能的;这是逐渐下溢的点。 – tmyklebu 2014-10-18 19:00:41
@tmyklebu:当然,但是“逐渐下溢”(AKA denormals)有其局限性。当然,产生一个小于最小反常值的数字的唯一方法就是让'x'和'y'的值不同,这是不可能的:) – 2014-10-18 19:02:03
@Paul R:现在排除了NaN情况(请参阅上面的编辑),所以我的问题更多的是处理“正常”浮点数。 – zell 2014-10-18 18:41:35
为什么downvote? – zell 2014-10-18 20:03:22
唯一的NaN情况是'x == y',两者都是无限的。 – tmyklebu 2014-10-18 20:28:53