C之浮點數(三)

        在 C 語言中,浮點數在內存中的存儲方式爲:符號位,指數,位數。float double 類型的數據在計算機內部的表示法是相同的,但由於所佔存儲空間的不同,其分別能夠表示的數值範圍和精度不同。如下所示:

圖片.png

        下來我們就來講講關於浮點數的轉換:1、將浮點數轉換成二進制;2、用科學計數法表示二進制浮點數;3、計算指數偏移後的值注意:計算指數時需要加上偏移量,而偏移量的值與類型有關。那麼實數 8.25 在內存中的 float 該怎麼表示呢?8.25 的二進制表示:1000.01 ==> 1.00001 * (2 ^ 3);符號位:0;    指數:127 + 3 ==> 130 ==> 1000 0010;    小數:00001    所以內存中8.25的 float 表示:0 1000 0010 0000 1000 0000 0000 0000 000 ==> 0x4104 0000

        我們在 Linux 中做個 8.25 的轉換實驗,看看它是否在內存中表示爲 0x4104 0000,代碼如下:

#include <stdio.h>

int main()
{
    float f = 8.25;
    
    unsigned int* p = (unsigned int*)&f;
    
    printf("0x%08X\n", *p);
    
    return 0;
}

        我們看到打印出的結果如下,確實是我們分析的那樣。

圖片.png

        在 C 語言中,int 類型的範圍爲:[ -2^31, 2^31 - 1];    float 類型的範圍是:[ -3.4 * 10^38, 3.4 * 10^38 ]。float 能表示的具體數字的個數與 int 相同。可表示的數字之間不是連續的,存在間隙。它只是一種近似的表示法,不能作爲精確數使用。由於內存表示法相對複雜,float 的運算速度比 int 慢的多。注意:double 與 float 具有相同的內存表示法,因此 double 也是不精確的。由於 double 佔用的內存較多,所能表示的精度也就比 float 高

        下來我們做個實驗,以驗證 float 所表示的數是不精確的,代碼如下:

#include <stdio.h>

int main()
{
 
    float f = 3.1415f;
    float fl = 123456789;
    
    printf("%0.10f\n", f);
    printf("%0.10f\n", fl);
    
    return 0;
}

        我們看到打印結果如下,我們期望的 f 本應該是3.141500000,f1 本應該是 123456789.0000000000,可是結果是 f = 3.1414999962;    f1 = 123456792.0000000000。這也從側面證實了我們說的是正確的,用浮點數表示的數字是不精確的。

圖片.png

        那麼關於浮點數,我們可總結爲:1、浮點類型與整數類型的內存表示法不同;2、內存表示更加複雜;3、可表示的範圍更大;4、是一種不精確的類型;5、它的運算速度比較慢。關於浮點數的相關知識我們就先學習到這了,後面我們繼續學習 C 語言的其他知識。


          歡迎大家一起來學習 C 語言,可以加我QQ:243343083

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章