所以我是 c 的新手,我刚刚了解了数据类型,让我困惑的是,例如 double 的值范围是从 2.3 E-308 到 1.7 E + 308,数学上是 100 位数 ∈ [2.3 E-308,1.7 E + 308]。
#include <stdio.h>
int main()
{
double c = 5416751717547457918597197587615765157415671579185765176547645735175197857989185791857948797847984848;
printf("%le",c);
return 0;
}
结果是 7.531214e + 18 通过改变% le 由% lf th 结果是 7531214226330737664.000000 不等于 c。
看起来,如果我们可以将多达 10 的数字存储为 308 的幂,那么我们将存储 308 位左右的数字,但是在浮点运算中,情况并非如此。浮点数不会存储为巨大的数字串。
从广义上讲,浮点数存储为尾数-通常是 0 到 1 之间的数字-和指数-某个数的幂。不同类型的浮点数(浮点,双精度,长双精度)各自具有分配给尾数和指数的不同位数。这些位计数,尤其是在尾数中,控制着表示数字的精度。
大多数平台上的 double 给出 16-17 个十进制数字的精度,而不管大小(十的幂)。可以使用将算术运算到所需的任何精度的库,尽管此类功能未内置到 C 中。
另一个复杂的问题是,在您的示例中,您分配给c
的数字实际上根本没有定义为浮点数。没有任何迹象表明它应该如此表示,编译器将其视为整数,并且由于它太大而无法容纳大多数平台上最大的整数类型,因此它被截断为整数范围。
你应该得到一个正确的编译器或启用警告。最近的 GCC,只有默认设置将输出以下警告:
% gcc float.c
float.c: In function ‘main’:
float.c:4:12: warning: integer constant is too large for its type
double c = 5416751717547457918597197587615765157415671579185765176547645735175197857989185791857948797847984848;
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
请注意,它说integer,即整数,而不是浮点数。在 C 中,该形式的常数表示整数。除非后缀为U
,否则它是适合的最大类型的有符号整数。但是,标准 C 和常见实现都没有足够大的类型来适应该值。因此,发生的是 [(C4.a)
如果整数常量不能由其列表中的任何类型表示,并且没有扩展的整数类型,则整数常量没有类型。
在算术中使用这种没有类型的整数常量会导致未定义的行为,即程序的整个执行现在毫无意义。
“修复”应该是在数字后面添加一个.
!
#include <stdio.h>
int main(void)
{
double c = 54167517175474579185971975876157651574156715791\
85765176547645735175197857989185791857948797847984848.;
printf("%le\n",c);
}
并运行它:
% ./a.out
5.416752e+99
请注意,即使这样,double
也只能精确地平均约 15 个有效的十进制数字。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(28条)