2014-03-28 39 views
0

我發現一些關於C編程和計算機精度的特性很有趣。 例如,在我的計算機中,如果我打印指示double的位精度的DBL_MANT_DIG變量(limits.h庫),則返回64.這表示64位尾數。這意味着我可以在尾數存儲多達19位數字。 但是,如果我要求電腦打印更多數字,比如printf("%.40lf",...),,它仍然會打印它們。那些數字是什麼以及它們存儲在哪裏?在C語言中的計算機精度

另一件事是,如果打印變量DBL_MAX我得到:179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 這有超過19位數字。他們再次存儲在哪裏?

要打印此號碼我做的:

#include <stdio.h> 
#include <stdlib.h> 
#include <limits.h> 
#include <float.h> 

int main(void) 
{ 

    printf("Double Min/Max: %lf %lf\n", DBL_MIN, DBL_MAX); 
    printf("Digits mantissa (bit precission) double: %d\n", DBL_MANT_DIG); 

    return 0; 
} 
+0

你應該顯示一些代碼。你是怎麼打印DBL_MAX的? –

+0

@DougCurrie完成! –

回答

3

(一IEEE double-precision floating point value有52位尾數,而不是64位)

你能想到的浮點數作爲存儲在科學記數法的二進制等價物。即使你發佈的數字有「超過19位數」,它仍然可以用52個尾數位表示。

想象一下你有一個尾數可以保存4位十進制數字和3位十進制數字指數。這是一個浮點數,但是是十進制的,不是二進制的。此處的最大可表示值爲9999e999(= 9999 * 10 ),其小數點擴展顯然具有遠遠超過4位的數字。但它是可代表使用4位十進制數字和3位指數。

+0

$ 10^{999} $有更多數字,但它們是尾隨零。不是一個數字序列。 –

+1

@JanusGowda如果你用不同的基數表示它,數字不會爲零。 – TypeIA

+0

@TypelA所以如果操作給出了無限序列,計算機在打印時計算這個值嗎?這很有趣。 –

2

這是一個思想實驗。考慮分數3/7。以小數點打印。

0.428571428571428571428571428571428571428571428571... 

數字在哪裏存儲?

+0

您是否意味着操作在打印時間上執行? –

1

考慮數字1/8。它可以只用一個指數而不用尾數來表示。然而這是十進制表示0.125有3個非零數字。在打印期間計算十進制表示。內部使用基數爲2的二進制表示。