Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c语言中100位的变量值_C_Types_Range - Fatal编程技术网

c语言中100位的变量值

c语言中100位的变量值,c,types,range,C,Types,Range,所以我是c新手,我刚刚了解了数据类型,让我困惑的是一个双精度的值范围,例如从2.3E-308到1.7E+308 数学上是100位数∈ [2.3E-308,1.7E+308]。 编写这个简单的程序 #include <stdio.h> int main() { double c = 5416751717547457918597197587615765157415671579185765176547645735175197857989185791857948797847984848;

所以我是c新手,我刚刚了解了数据类型,让我困惑的是一个双精度的值范围,例如从2.3E-308到1.7E+308 数学上是100位数∈ [2.3E-308,1.7E+308]。 编写这个简单的程序

#include <stdio.h>
int main()
{
double c = 5416751717547457918597197587615765157415671579185765176547645735175197857989185791857948797847984848;   
printf("%le",c);
return 0;
}
#包括
int main()
{
双c=54167517175474579185971975876157657415671157918576517654764573517519785798918579185794879787847984848;
printf(“%le”,c);
返回0;
}
通过将%le更改为%lf,结果为7.531214e+18,结果为7531242630737664.000000 这不等于c。
那么问题是什么呢

这个长数字实际上是
long
类型的数值文字。但由于此类型不能包含如此长的数字,因此它被截断为模
(LLONG_MAX+1)
,并导致
7531242633073360

编辑:

@约翰伯林格:。。。然后转换为double,导致精度损失几个(二进制)数字


@rici:-这里的常量是双精度的,因为增加了小数点。如果我们能将10的数字存储到308的幂,我们就可以存储308位左右,但在浮点运算中,情况并非如此。浮点数不存储为庞大的数字字符串

从广义上讲,浮点数被存储为尾数(通常是介于0和1之间的数字)和指数(某个数字提升到另一个数字的幂)。不同种类的浮点数(float、double、longdouble)都有不同数量的位分配给尾数和指数。这些位计数,特别是在尾数中,控制数字表示的精度

大多数平台上的双精度给出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;
            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
请注意,它表示整数,即整数,而不是浮点。在C中,这种形式的常数表示一个整数。除非后缀为
U
,否则它是一个额外的有符号整数,属于它所适合的最大类型。然而,无论是标准C还是普通实现,都没有一个足够大的类型来适应这个值。所以发生的情况是[(C116.4.4.1p6)]:

如果整数常量不能由其列表中的任何类型表示,并且没有扩展的整数类型,则整数常量没有类型。

使用这样一个整数常量而不在算术中输入,会导致未定义的行为,即程序的整个执行现在没有意义。您应该已经阅读了警告

“修复”应该是在数字后添加一个

#include <stdio.h>
int main(void)
{
    double c = 54167517175474579185971975876157651574156715791\
85765176547645735175197857989185791857948797847984848.;
    printf("%le\n",c);
}

<>注意,即使是,代码< >双/C++ >平均只有15个重要的十进制数字。

不同于机器,也就是DFE.WEY超过一个加倍的极限。在OR中得到整数限制。C中定义浮点特性。C++中,首选的版本通常是STD::NoimiCiLime::Max()。(你#包括在内)。从这个网站:可能会帮助你理解范围和重要性之间的区别。A
double
代表A(通常)大约有16位有效十进制数字的近似值。浮点变量有一个有效位、2的幂和一个符号。常量是一个整数,在转换之前会被截断。向它添加一个
.0
。这里有一个以上的混淆…然后转换为
双精度
,结果会丢失一些(二进制)精度数字。在打开警告的情况下,您应该得到“整型常量对于其类型来说太大”,然后你会发现需要通过添加
.0
,使其成为双常量。这都是真的,但不是他的问题。他的问题不是小数点,因此编译器尝试将数字读取为整数,将其截断为64位,然后转换为双常量。确实如此。这就是我编写的原因“编译器会将其视为一个整数,并且…”;)谢谢你的回答,我想知道如何用非科学记数法打印完整的数字?再次感谢你。很抱歉,我不理解“54167517175474579185……………..8797847984848”和“54167517175474579185………..87978479848.”之间的区别。“最后。对我来说,它们是相同的号码。我是c的新手。谢谢你抽出时间
% ./a.out
5.416752e+99