2 浮點數
阿新 • • 發佈:2020-08-29
目錄
記憶體中的浮點數
-
浮點數在記憶體中的儲存方式為:符號位,指數,尾數
型別 符號位 指數 尾數 float 1位(第31位) 8位(第23-30位) 23位(第0-222位) double 1位(第63位) 11位(第52-62位) 52位(第0-51位) -
float
與double
型別的資料在計算機內部的表示法是相同的,但由於所佔儲存空間 的不同,其分別能夠表示的數值範圍和精度不同。
浮點數儲存示例
-
浮點數的轉換
-
將浮點數轉換成二進位制
-
用科學計數法表示二進位制浮點數
-
計算指數偏移後的指
-
注意:計算指數時,需要加上偏移量,偏移量的值與型別有關
如:對於指數6,偏移後的指如下:
float
:127+6 -> 133double
:1023+6 -> 1029
-
-
示例:實數8.25在記憶體中的
float
表示- 8.25的二進位制表示:1000.01 -> 1.00001*(2^3)
- 符號位:0
- 指數:127+3 ->130 -> 1000 0010
- 小數:00001
- 記憶體中8.25的
float
表示為:0 10000010 00001000000000000000000 -> 0x41040000
#include <stdio.h> int main() { float f = 8.25; unsigned int* p = (unsigned int*)&f; //%08x為整型以16進位制方式輸出的格式字串,會把後續對應引數的整型數字,以16進位制輸出。08的含義為,輸出的16進位制值佔8位,不足部分左側補0。 printf("0x%08X\n", *p); return 0; } //輸出結果: 0x41040000
int 和 float 表示的範圍
-
int
型別的範圍:\([-2^{31},2^{31}-1]\) -
float
型別的範圍:\([-3.4*10^{38},3.4*10^{38}]\) -
int
和float
都佔4個位元組的記憶體,為什麼float
卻比int
的範圍大得多?float
能表示的具體數字的個數與int
相同float
可表示的數字之間不是連續的,存在間隙float
只是一種近似的表示法,不能作為精確數使用- 由於記憶體表示法相對複雜,
float
的運算速度比int
慢得多
#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