假設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