2014-10-18 75 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