2014-10-18 74 views
2

假设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。

+0

@Paul R:现在排除了NaN情况(请参阅上面的编辑),所以我的问题更多的是处理“正常”浮点数。 – zell 2014-10-18 18:41:35

+0

为什么downvote? – zell 2014-10-18 20:03:22

+0

唯一的NaN情况是'x == y',两者都是无限的。 – tmyklebu 2014-10-18 20:28:53

回答

1

[注:我忽略了无穷大和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一些具体的编译器的魔力。然而,允许有一个根本没有低于正常值的浮点实现,并且在这样的系统上不需要魔术来实现相同的非等价。

+2

如果逐渐下溢,减法显然是不可能的;这是逐渐下溢的点。 – tmyklebu 2014-10-18 19:00:41

+0

@tmyklebu:当然,但是“逐渐下溢”(AKA denormals)有其局限性。当然,产生一个小于最小反常值的数字的唯一方法就是让'x'和'y'的值不同,这是不可能的:) – 2014-10-18 19:02:03