1. 程式人生 > >C語言進階剖析 03 浮點數的祕密

C語言進階剖析 03 浮點數的祕密

記憶體中的浮點數

  • 浮點數在記憶體的儲存方式為:符號位指數尾數
    在這裡插入圖片描述

floatdouble 型別的資料在計算機內部的表示方法是相同的,但是由於所佔儲存空間的不同,其能夠表示的資料範圍和精度不同。


浮點數儲存示例

  • 浮點數的轉換
        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

小結

  • 浮點型別與整數型別的記憶體表示法不同
  • 浮點型別的記憶體表示法更復雜
  • 浮點型別可表示的範圍更大
  • 浮點型別是一種不精確的型別
  • 浮點型別的運算速度較

內容參考狄泰軟體學院系列課程,如有侵權,請聯絡作者刪除!感謝~