【发布时间】:2020-06-24 10:30:11
【问题描述】:
虽然这个网站上有一些答案,但我还是搞不懂sizeof(long double)的意思。为什么打印var3的输出是3.141592653589793115998?
当我尝试执行另一个人的代码时,它的运行方式与另一个人不同。有人可以帮我解决这个问题吗?
我的测试代码:
float var1 =3.1415926535897932;
double var2=3.1415926535897932;
long double var3 =3.141592653589793213456;
printf("%d\n",sizeof(float));
printf("%d\n",sizeof(double));
printf("%d\n",sizeof(long double));
printf("%.16f\n",var1);
printf("%.16f\n",var2);
printf("%.21Lf\n",var3);
我的测试代码的输出:
4
8
16
3.1415927410125732
3.1415926535897931
3.141592653589793115998
代码与另一个人相同,但另一个人的输出是:
4
8
12
3.1415927410125732
3.1415926535897931
3.141592741012573213359
有人能告诉我为什么我们的输出不同吗?
【问题讨论】:
-
欢迎来到 SO。请将您的代码添加到问题中。不要强迫读者关注外部链接。另外请不要将文字作为图片发布。包含改为文本。
-
使用 GNU C 编译器,long double 是 x86 处理器上的 80 位扩展精度,与用于该类型的物理存储(可以是 96 位或 128 位)无关,[10] 在某些在其他架构中,long double 可以是 double-double(例如在 PowerPC[11][12][13] 上)或 128 位四倍精度(例如在 SPARC[14] 上)。从 gcc 4.3 开始,x86 也支持四倍精度,但作为非标准类型 __float128 而不是 long double。[15] [More info]
-
如果您要查看所有图像,“这是我的测试代码”、“这是我的测试代码的输出”和“这是另一个人的代码和输出”帮助。谢谢!
-
@DavidRanieri 那么,如果我希望 sizeof(long double) 的输出为 10 字节,你能告诉我该怎么做吗?我不应该使用 GNU C 编译器吗?或者有什么可以推荐给我的?谢谢!
-
我不应该使用 GNU C 编译器吗? 你有什么问题?您是否需要比某些实现提供的精度更高的精度?我们经常使用 epsilons 来处理这类问题(
LDBL_EPSILONinfloat.h),看看en.wikipedia.org/wiki/Machine_epsilon
标签: c floating-point precision sizeof long-double