關於浮點數比較有大量的文檔和討論。但是對於我來說,目前尚不清楚能否保證直接比較數字在所有編譯器和平臺上都能正常工作?精確值的雙/浮點比較
double x = 1.;
if (1. == x)
{
//do something
}
我們總是會輸入if
塊嗎?
編輯:
這裏什麼比較正確的是(永久有效)?這一個?:
double x = 1.;
if (std::abs(1. - x) < std::numeric_limits<double>::epsilon())
{
//do something
}
一些浮點值,例如'1.0',可以用IEEE浮點格式(這是最常用的格式)精確表示。所以你的比較可以在你顯示的確切代碼中正常工作。但是,嘗試在'x'上執行一些操作,*應該*將其保留爲'1.0',然後重試比較,並且很可能不起作用。 –
聽起來像你應該閱讀這個:https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html –
爲了解決你的問題的第二部分,不,'std :: numeric_limits: :epsilon()'不打算像那樣使用。 'std :: numeric_limits :: epsilon()'是格式精度的度量,它不是前面計算精度的度量。如果前面的計算可能產生了0.125的絕對誤差,並且您希望在數學計算產生1.0時檢測出沒有誤報的測試,請使用std :: abs(1.x)<= 0.125'。在所有情況下,無論上下文如何,RHS都沒有可用的神奇價值。 –