這是我的代碼。爲什麼我的第一行代碼不能正常工作?爲什麼我無法將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.0'和'4.0'都是'double'而不是'長double'。可能會影響結果。 –
我試着將4.0作爲一個長的雙倍,它並沒有幫助。 –
visual studio 2015給出了正確的結果。另外:LDBL_EPSILON與VS中的DBL_EPSILON相同。 – Laurijssen