1. 程式人生 > 實用技巧 >2 浮點數

2 浮點數

目錄

記憶體中的浮點數

  • 浮點數在記憶體中的儲存方式為:符號位,指數,尾數

    型別 符號位 指數 尾數
    float 1位(第31位) 8位(第23-30位) 23位(第0-222位)
    double 1位(第63位) 11位(第52-62位) 52位(第0-51位)
  • floatdouble 型別的資料在計算機內部的表示法是相同的,但由於所佔儲存空間 的不同,其分別能夠表示的數值範圍和精度不同。

浮點數儲存示例

  • 浮點數的轉換

    • 將浮點數轉換成二進位制

    • 用科學計數法表示二進位制浮點數

    • 計算指數偏移後的指

    • 注意:計算指數時,需要加上偏移量,偏移量的值與型別有關

      如:對於指數6,偏移後的指如下:

      float :127+6 -> 133

      double :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}]\)

  • intfloat 都佔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