浮点数据类型
文章目錄
- 1 浮點數的內存表示
- 1.1 內存中的浮點數
- 1.2 浮點數的轉換
- 1.3 浮點數的不連續
- 1.4 浮點數的大數吃小數問題
- 2 浮點數據輸出控制和精度
- 2.1 浮點數據的輸出控制
- 2.2 浮點數據的精度
1 浮點數的內存表示
1.1 內存中的浮點數
浮點數在內存中的存儲方式為:符號位、指數、尾數。
float和double類型的數據在計算機內部的表示方法是相同的,但由于所占存儲空間的不同,其分別能夠表示的數值范圍和精度不同。
浮點數的特殊情況:
1.2 浮點數的轉換
浮點數的轉換步驟:
注意:計算指數時需要加上偏移量,而偏移量的值與類型有關。
對于指數6,偏移后的值如下:
- float:127 + 6 ? 133
- double:1023 + 6 ? 1029
轉換示例:
通過unsigned int類型的指針將浮點數的內存表示打印出來:
1.3 浮點數的不連續
思考:int和float都占4個字節的內存,為什么float卻比int的范圍大的多呢?
浮點類型的特點:
- float能表示的具體數字的個數與int相同。
- float可表示的數字之間不是連續的,存在間隙。
- float只是一種近似的表示法,不能作為精確數使用。
- 由于內存表示法相對復雜,float的運算速度比int慢得多。
注意:double與float具有相同的內存表示法,因此double也是不精確的。由于double占用的內存較多,所能表示的精度比float高。
1.4 浮點數的大數吃小數問題
浮點數的加法需要先對階,再計算,以0.5加0.125為例,計算過程如下:
我們可以看到在對階的過程中,當大數比小數大很多時(大概是1600萬倍時),小數由于右移而導致全部數據移出變為0。
2 浮點數據輸出控制和精度
2.1 浮點數據的輸出控制
#include<iostream> #include<Windows.h>using namespace std;int main(void){double value = 12.3456789;// 默認精度是6,所以輸出為 12.3457 //(默認情況下,精度是指總的有效數字)cout << value << endl; // 把精度修改為4, 輸出12.35, 對最后一位四舍五入// 精度修改后,持續有效,直到精度再次被修改cout.precision(4);cout << value << endl;// 使用定點法, 精度變成小數點后面的位數// 輸出12.3457cout.flags(cout.fixed); cout << value << endl;// 定點法持續有效// 輸出3.1416cout << 3.1415926535 << endl;// 把精度恢復成有效數字位數cout.unsetf(cout.fixed);cout << value << endl; //輸出12.35cout << 3.1415926535 << endl; //輸出3.142system("pause");return 0; }2.2 浮點數據的精度
#include <Windows.h> #include <iostream>using namespace std;int main() {float f = 0.123456789f;double d = 0.123456789123456789;cout.precision(9);cout.flags(cout.fixed); //輸出0.123456791,float類型的數據精度為7位cout << f << endl;cout.precision(18); //輸出0.123456789123456784,double類型的精度為16位(測出來17位,巧合?)cout << d << endl;system("pause");return 0; }參考資料:
總結
- 上一篇: 调味瓶制作工艺有哪些?
- 下一篇: 十六进制速查表