C++之Float型別, double型別
c++裡的小數分為float和double兩種型別, 這兩種型別, 直接看程式碼, 及執行結果我們來看一下他們有什麼區別:
#include "iostream" using namespace std; int main() { float tub = 10.0 / 3.0; double mint = 10.0 / 3.0; // 注意1.0E6之間不能有空格 const float million = 1.0E6; cout << "tub = " << tub; // cout的預設輸出是會把無效位(也就是末尾的0給去掉), 並可能 // 採用科學計數法進行顯示(這行程式碼就顯示: “, a million tubs = 3.33333e+06”) cout << ", a million tubs = " << million * tub; // 這行程式碼就強制讓cout輸出原始資料例如:333333.250000 cout.setf(ios_base::fixed, ios_base::floatfield); cout << ", after translate a million tubs = " << million * tub; cout << ", \n and ten million tubs = "; cout << 10 * million * tub << endl; cout << "mint = " << mint << " and a million mints = "; cout << million * mint << endl; return 0; }
再來看程式碼的執行結果:
接下來分析一下程式碼, 程式碼邏輯很簡單, 這裡只說一行:
cout.setf(ios_base::fixed, ios_base::floatfield);
這行程式碼就強制讓cout輸出原始資料例如:333333.250000, 而不是cout預設的那種輸出3.33333e+06這種格式, 僅僅是為了好對float和double的結果進行對比
通過執行結果我們能看的出來:
tub 和 mint還都算是精確, 但是把他們放大1000000後發現tubs已經不精確了, 而mints還算是精確,
我們可以看出來, 在該系統中, 將tub*1000000後的結果為3333333.250000, 也就是不再精確, 但是保證了7位有效位, 也就是小數點後能保證6位是精確的(如果tub * 1000000 * 10 結果就更不精確了, 說明了float的精確度是有限的), 與之相比, double能至少保證13位是有效的, 因此相比而言double更精確一點.
在程式中預設情況下1.23和1.23E8都儲存為double型別(個人覺得是更精確), 如果希望常量儲存為float型別, 需要在常量後面加上f或F, 例如1.23f, 如果要儲存為long double型別, 則可以使用l或L字尾:
1.23f float型別; 1.23E5F float型別, 1.23E4 double型別, 1.23L long double型別
我們再來看另一個例子:
#include "iostream" using namespace std; int main() { float a = 1.23E10; float b = a + 1.0f; cout.setf(ios_base::fixed, ios_base::floatfield); cout << "a = " << a << endl; cout << "b = " << b << endl; cout << "b - a = " << b - a << endl; }
執行結果:
從這裡雖然b比a多了1, 但是由於float只能精確到第6, 7位, 所以多加的1對於b來說等於沒有, 因此他們的相減的結果為0, 這也進一步說明了float的不精確