2015-04-07 127 views
-2

http://www.cprogramming.com/tips/tip/difference-between-float-and-double來自:浮點和雙精度恆定比較

在C++等任何4.12值被視爲雙默認情況下。 比較花車和雙打可能是一個棘手的業務,因爲精度差異導致微小的錯誤。例如:

float a = 4.12; 

if(a == 4.12) 
{ 
    cout << "hello"; 
} 
else 
{ 
    cout << "bye"; 
} 

這將顯示您的輸出爲 「再見4.12」

爲什麼?

因爲默認情況下4.12是雙精度(例如在if語句中,或者在賦值給我們的變量時是 ),但是將其存儲在浮點中會損失一些精度,因此比較double和float 導致數字精確度的微觀變化 - 記住 漂浮和雙打不準確。

這裏有兩個教訓:一個是大部分時間不應該直接比較浮點數,另一個是硬編碼浮點數的默認大小和類型是雙精度浮點數的兩倍。

事情是'你不應該做比較浮點變量和雙常數'。

所以我的問題是,比較浮動變量和浮動常量,然後'f'是好的?

就是這樣。

if(a == 4.12f) 
+3

呃你的問題是什麼? – Turtle

+0

你問是否將一個浮點型常量與一個用雙常量初始化的浮點型變量(除了f之外的浮點型常量相同)總是計算爲相等?如果是這樣,我認爲這是一個合理的問題。 – samgak

+0

@samgak是的,確切地說。對不起,我英文很差。 –

回答

1

比較浮子可變和漂浮恆定,隨後由 'f' 是OK?

這仍然是危險的。不像你float/double例如這很可能會失敗的a每一個可能的值,實際上是a一個值,對於這個a == 4.12ftrue,但是這取決於你如何設置a,即使你希望它也可能不匹配4.12f。例如:

#include <iostream> 
#include <iomanip> 

int main() 
{ 
    float f = 4.14; 
    f -= 0.01; 
    f -= 0.01; 
    std::cout << std::boolalpha << (f == 4.12f) << '\n'; 
} 

ideone.com here此輸出:

false 

標準並保證最近表示將在特定情況下使用,因此,如果您直接分配float a = 4.12f;然後事後a == 4.12f必然是true ,第26.5.1.4節保證,如果你流出a並將文本流式傳輸到另一個float,那麼它們將在之後進行比較。

無論如何,如果你覺得你必須依賴這樣的事情,請檢查標準/文檔以瞭解你正在考慮的具體用法。