2016-01-21 83 views
1

這是我的代碼。爲什麼我的第一行代碼不能正常工作?爲什麼我無法將LDBL_EPSILON添加到1

long double X; 
X = 1.0 + 4.0*LDBL_EPSILON;    // The result is always 1.0 
X = (long double)1.0 + 4.0*LDBL_EPSILON; // Gives the correct result sometimes. 

X = LDBL_EPSILON; 
X += 1.0;   // These 2 lines seem to always give the correct result. 

上面提到的不規律行爲在構建之間發生了變化,沒有對此特定代碼進行任何更改。我正在使用C++ Builder XE3。我是否需要將編譯器開關設置爲正確使用長整型,或者這是編譯器錯誤還是什麼?

編輯:我試着用這行代碼,它似乎總是工作。每鮑勃__的問題

long double X; 
const long double epsilon = 1.084202172485504434E-19; 
X = 1.0 + 14.0*epsilon; // This result is correct 

但是,如果我的代碼行與LDBL_EPSILON取代ε,我可以很容易地重現該問題

X = fabsl(1.0) + 4.0*LDBL_EPSILON; 

EDIT2。

EDIT3:與鮑勃__的幫助下,我發現我的LDBL_EPSILON的定義沒有足夠的‘L’後綴。我不知道爲什麼它有時會起作用,而不是其他人,但是,添加後綴似乎解決了我的問題。

謝謝鮑勃!

+1

'1.0'和'4.0'都是'double'而不是'長double'。可能會影響結果。 –

+0

我試着將4.0作爲一個長的雙倍,它並沒有幫助。 –

+0

visual studio 2015給出了正確的結果。另外:LDBL_EPSILON與VS中的DBL_EPSILON相同。 – Laurijssen

回答

2

如果你想在計算長雙,你應該使用長雙後綴。

I.e.它應該是:

X = 1.0L + 4.0L * LDBL_EPSILON; 

顯然LDBL_EPSILON是如此之小,以至於當將其加到1.0倍時,它被切斷。在某些編譯器上,LDBL_EPSILON可能沒有後綴定義,因此它不會強制執行長整倍數的計算。

+0

我也試過這個,但它沒有幫助。這個問題最令人不安的地方在於構建之間不一致。 –

相關問題