C語言進階剖析 03 浮點數的祕密
阿新 • • 發佈:2019-01-09
記憶體中的浮點數
- 浮點數在記憶體的儲存方式為:符號位,指數,尾數
○ float
與 double
型別的資料在計算機內部的表示方法是相同的,但是由於所佔儲存空間的不同,其能夠表示的資料範圍和精度不同。
浮點數儲存示例
- 浮點數的轉換
1.將浮點數轉換成二進位制數
2.用科學計數法表示二進位制浮點數
3.計算指數偏移後的值
注意: 計算指數時需要加上偏移量,而偏移量的值與型別有關
例:對於 指數 6 ,偏移後的值如下
float : 127 + 6 => 133
double : 1023 + 6 => 1029
十進位制浮點數的記憶體表示
- 實數8.25 在記憶體中的float表示
○ 8.25 的二進位制表示 : 1000.01 => 1.00001 * (2^3)
■ 符號位:0
■ 指數: 127 + 3 => 130 => 10000010
■ 小數:00001
○ 記憶體中 8.25 的float表示: 0 10000010 00001000000000000000000 => 0x41040000
程式設計實驗:10進位制浮點數的記憶體表示
#include <stdio.h>
int main()
{
float f = 8.25;
unsigned int* p = (unsigned int*)&f;
printf("0x%08x\n", *p);
return 0;
}
輸出:
0x41040000
有趣的問題
- int 型別的範圍 : [-2^31, (2^31)-1]
- float 型別的範圍 : [-3.410^38, 3.410^38]
- 思考: int 和 float 都佔用 4 個位元組,為什麼 float 卻比 int 的範圍大呢?
浮點數的祕密
- float 能表示的具體數字的個數與int相同
- float 可表示的數字之間不是連續的,存在間隙
- float 只是一種近似的表示法,不能作為精確數使用
- 由於記憶體表示法相對複雜,float的運算速度比int慢的多
注意:double與float具有相同的記憶體表示法,因此double也是不精確的。由於double佔用的記憶體較多,所能表示的精度比float高。
示例分析:float 型別的不精確表示
#include <stdio.h>
int main()
{
float f = 3.1415f;
float f1 = 123456789;
printf("%0.10f\n", f);
printf("%0.10f\n", f1);
return 0;
}
輸出:
3.1414999962
123456792.0000000000
小結
- 浮點型別與整數型別的記憶體表示法不同
- 浮點型別的記憶體表示法更復雜
- 浮點型別可表示的範圍更大
- 浮點型別是一種不精確的型別
- 浮點型別的運算速度較慢
內容參考狄泰軟體學院系列課程,如有侵權,請聯絡作者刪除!感謝~