C++預設有效位數 C++ 預設有效位數為 6 位,指數位和小數位共用。超過有效位數時,只輸出前 6 位,且第六位四捨五入運算。 cout << 12345.54555 << "\n"; // 輸出 12345.5 cout << 12345.55555 << "\n"; // 輸出 12345.6 ...
C++預設有效位數
C++ 預設有效位數為 6 位,指數位和小數位共用。超過有效位數時,只輸出前 6 位,且第六位四捨五入運算。
cout << 12345.54555 << "\n"; // 輸出 12345.5
cout << 12345.55555 << "\n"; // 輸出 12345.6,被四捨五入了
cout << 123456.45555 << "\n"; // 輸出 123456
cout << 123456.55555 << "\n"; // 輸出 123457,被四捨五入了
當 整數位超過有效位數後,自動變為科學計數法輸出。
cout << 1234567.12345 << "\n"; // 輸出 1.23457e+06
cout << 12345678901234567890.12345 << "\n"; // 輸出 1.23457e+19
fixed函數
該函數用於切換有效位數的判斷邏輯,未使用時指數位和小數位共用有效位數,使用後變為小數位獨享。
cout << fixed << 123456.1234564 << "\n"; // 輸出 123456.123456
cout << fixed << 123456.1234565 << "\n"; // 輸出 123457.123457,被四捨五入了
setprecison函數
該函數用於修改有效位數,單獨使用時整數位和小數位共用修改後的有效位數,與 fixed
配合時變為小數位獨享。
cout << setprecision(10) << 123456.123456; // 輸出 123456.1235
cout << fixed << setprecision(10) << 123456.123456; // 輸出 123456.1234560000
函數的返回類型與隱式轉換1
這一問題在 pow
函數的使用過程中非常常見。眾所周知,pow
函數會返回一個浮點數類型的答案,這就導致令人頭疼的精度問題會再次出現。
double p = pow(8, 1.0 / 3);
double q = pow(216, 1.0 / 3);
cout << fixed << setprecision(12) << p << "\n"; // 輸出 2.000000000000
cout << fixed << setprecision(20) << p << "\n"; // 輸出 2.00000000000000000000
cout << fixed << setprecision(12) << q << "\n"; // 輸出 6.000000000000
cout << fixed << setprecision(20) << q << "\n"; // 輸出 5.99999999999999911182
如果這一問題配合上隱式轉換,就會產生災難(備註:\(\sqrt[3]{216}=6\),由於 pow
得到的是 5.99999… ,隱式轉換將小數部分全部捨去後輸出 5 )。
double q = pow(216, 1.0 / 3);
cout << (int)q << "\n"; // 輸出 5
註:如果需要開立方根,C++庫中自帶函數 cbrt
,用法與 sqrt
一致,且兩者都保證精確。
函數的返回類型與隱式轉換2
double與int比較
int num1 = 0, num2 = 0;
for (int i = 1; i <= 100; i++) {
if (sqrt(i) * sqrt(i) == i) {
num1++;
}
if ((int)sqrt(i) * (int)sqrt(i) == i) {
num2++;
}
}
cout << num1 << "\n"; // 輸出 49,答案錯誤!
cout << num2 << "\n"; // 輸出 10,答案正確
浮點註意事項
(1)某些函數並不支持浮點數傳入,例如 minmax
函數,翻閱庫之後我們可以發現,其只支持傳入整數/字元串列表;
(2)浮點數整數和小數部分共用精度,所以在計算時,整數部分越大,小數部分精度越差。一般我們預設在數據集超過 10^6 時不再使用浮點數進行運算,否則會出現很嚴重的精度誤差。
(3)由於浮點數四則運算存在嚴重誤差,故一般我們預設不直接對浮點數進行大小比較、也不直接對浮點數進行符號判斷。