当前位置:  开发笔记 > 运维 > 正文

double和long double:我的电脑上是否相同?

如何解决《double和longdouble:我的电脑上是否相同?》经验,为你挑选了1个好方法。

这是ANSI C代码:

   float        x = 3.14159264351134890172;
   double       y = 3.14159264351134890172;
   long double  z = 3.14159264351134890172;

   printf("%f\n",x);
   printf("%f\n",y);
   printf("%f\n",z);
   printf("%.20f\n",x);
   printf("%.20f\n",y);
   printf("%.20f\n",z);

此代码的输出是:

3.141593
3.141593
3.141593
3.14159274101257324219
3.14159264351134881466
3.14159264351134881466

见最后一行输出.我读过,long double给出了小数点后19位的准确度.但是在这里我得到小数点后的15位精度.所以在我的电脑doublelong double电脑之间没有区别.我在2.6.32-358.el6.x86_64CentOS上使用linux内核.我的C编译器是gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC)

为什么会这样?如果它取决于计算机硬件/架构,我如何购买我的linux机器,其中long double比double更精确?它还依赖于我的C编译器吗?如果是,我如何选择我的C编译器?

对于float价值范围是1.2E-38 to 3.4E+38.我不明白.从上面的例子我们看到我们无法在float变量中正确存储分数十进制数,例如3.1415926 .我的机器只能在该float变量中正确存储3.141592 .所以我丢失了最后7位数,这是6.那为什么我们说float范围是1.2*10 ^ -38?

是不是我们不能存储到10 ^ -38但是我们可以float在C中存储最多10 ^ -6的变量?



1> Pascal Cuoq..:

首先,你应该打印long double%Lf.

其次,如果您希望long double变量包含无法表示为a的值,则double不应使用double常量对其进行初始化.3.14159264351134890172具有类型double,如果您的编译器定义FLT_EVAL_METHOD为0或1,则使用long double z = 3.14159264351134890172;集合zdouble值,即使该类型long double可以在您的平台上更紧密地表示该常量.相反,该行应为:

long double  z = 3.14159264351134890172L;

在"浮动值范围是1.2E-38到3.4E + 38 ......"之后,您的问题的简短答案是您的机器上的浮点格式是基数2,并且这些格式中的可表示值不相同就像它们在基数10中表示一样.float平台上的类型提供了精确的24 位二进制数字.类型double提供53,你应该能够long double提供64.对于StackOverflow格式,长答案太长了,但你可以从阅读http://floating-point-gui.de开始.

推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有