2014-03-28 29 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的二进制表示。