2012-08-06 68 views
0

當我存儲12位小數的浮點值後高達6小數地方它是表示固定值。如果它是垃圾值那麼它應該是爲不同的編譯器不同,但是當我看到的輸出在我的書,幾乎都嘗試過,兩者都是相同的結果。浮點值

#include <stdio.h> 

int main(void) 
{ 
    float a = 1.234567890000; 

    printf("%.12f\n", a); 
    return 0; 
} 

OUTPUT:

1.234567880630 // In my book it also represents same output. 
+3

你的問題是什麼?爲什麼你的輸出與你的輸入不符?因爲你輸入的是10進制數,但是計算機將它存儲爲2進制數,並且'float'中沒有足夠的分辨率來準確地獲得所有12位小數。 – 2012-08-06 17:13:35

+1

請注意,您從'double'文字開始,將其轉換爲'float'進行存儲,然後將其轉換回'double'進行打印。 – 2012-08-06 17:23:03

回答

0

浮子(在大多數系統)存儲它在32位的值,對這些位符號,指數和「有效數字」(該值的主要部分)之間劃分這會給大多數值提供7到8位數的小數精度,遠遠低於您所看到的12位數字。

double使用64位,並給出大多數值的15-16位精度。

你周圍的7-9th數字越來越奇數值,因爲你的編譯器有舍入到存儲它的價值。舍入方法非常標準,因此編譯器通常會給出相同的舍入結果。請注意,C/C++通常要求編譯器提供「最小」尺寸,但是這些值可能存儲在較大的存儲器中,例如在CPU寄存器中,所以您的里程在低有效位上會有所不同。

3

如果它是垃圾值,那麼它應該是不同的編譯器,但當我看到我的書中的輸出,並嘗試幾乎他們都是相同的結果。

有一個非常好的機會,你的編譯器和你正在使用的書都使用IEEE 754標準浮點數,並具有類似mechansims處理的值。因此,他們可能會得到與其他許多編譯器和系統相同的答案。

的主要問題是在how floating point values are stored和功能。 32位浮點值沒有足夠的精度來精確地表示12位小數位,因此您得到的輸出與輸入的不同。

1

期望編譯器實現IEEE 754標準的浮點數。對於float(binary32位),數字有23位,符號有1位。這給你7.x十進制數字。所以你看到的是正確的。

如果你需要它採用52位的數字,併爲您提供了34位精度更精確使用雙。