1. 程式人生 > >C之浮點數(三)

C之浮點數(三)

C語言 浮點數

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

技術分享圖片

下來我們就來講講關於浮點數的轉換: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;
}

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

技術分享圖片

在 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。這也從側面證實了我們說的是正確的,用浮點數表示的數字是不精確的。

技術分享圖片

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


有興趣的可以加我一起學習 C 語言,QQ:243343083

C之浮點數(三)