我试图理解我可以存储在C中的最大值。我尝试做printf("%f",pow(2,x))。答案是有效的,直到x = 1023.它表示当x = 1024时的Inf。
我很抱歉这是一个基本问题,但我想了解C如何分配数据类型'尺寸基于我的机器。
我有一台Mac(64位处理器)。我清楚地了解到我的处理器是64位处理器,它能够进行高达2 ^ 64的计算。显然,pow(2,1023)大于此。但我的程序工作正常,直到x = 1023.这怎么可能? GNU编译器是否与此有关?
如果这是其他问题的重复,请给出链接。提前谢谢。
答案 0 :(得分:4)
在C中,pow()
函数返回double
,double
类型通常是浮点数字的64位IEEE格式表示。
浮点的基本思想是以与例如一般的方式表达数字。 1.234×10 56 。这里有尾数 1.234和指数 56. C ++,也可能是C,允许浮点数的十进制表示(但不适用于整数类型),但在实践中内部表示将是二进制的,功率为2而不是10的幂。
您遇到的限制是编译器表示double
个数字时指数的支持范围;可能是64位 IEEE 754 。
各种内置整数数字类型的限制可用作<limits.h>
的符号常量。内置浮点类型的限制可用作<float.h>
的符号常量。有关详细信息,请参阅cppreference.com上的表格。
在C ++中,这些限制也可以通过numeric_limits
中的<limits>
类模板获得。
答案 1 :(得分:3)
64位处理器通常意味着它可以处理最多64位的数字,而不是它只能处理64位或更少的数字。如果您有足够的RAM(和时间),使用arbitrary precision arithmetic可以对任意大的数字进行计算。在此处阅读更多内容:What is the biggest number you can generate using a 64 bit processor?
pow(2, 1023)
返回一个带有符号的浮点数,一个尾数和一个像(-1)^sgn(2^1023)*1*2^1023
这样的指数。它不会存储所有数字,因此它只能精确到前几位数。然而,大多数系统使用二进制浮点类型,因此对于二进制,它可以存储2的幂的精确值,直到大的功率,具体取决于指数范围。大多数情况下,浮点类型符合IEEE 754标准,因此您可以找到最大值here
您还可以找到不同类型here的最大值的常量。
答案 2 :(得分:1)
double
的最大值为DBL_MAX
。这在C中是defined by <float.h>
,在C ++中是<cfloat>
。数值可能因系统而异,但您始终可以通过宏DBL_MAX
引用它。
你可以打印这个:
printf("%f\n", DBL_MAX);
整数数据类型都具有<limits.h>
中定义的类似宏:例如ULLONG_MAX
是unsigned long long
的最大价值。如果使用printf
进行打印,请确保使用正确的格式说明符。