C 为什么它的输出不是它应该是什么?

C 为什么它的输出不是它应该是什么?,c,floating-point,pow,exponent,C,Floating Point,Pow,Exponent,所以我有一个任务来计算10^100,必须在结果中使用pow函数。下面是代码: #include <stdio.h> #include <math.h> int main() { long double result; result = pow(10, 100); printf("10^100 = %Lf", result); } 我得到了我应该得到的,即1000000000000000000000000000000000000

所以我有一个任务来计算10^100,必须在结果中使用pow函数。下面是代码:

#include <stdio.h>
#include <math.h>
int main()
{
    long double result;
    result = pow(10, 100);
    printf("10^100 = %Lf", result);
}
我得到了我应该得到的,即10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000


因此,请有人解释为什么会发生这种情况以及如何避免这种情况?

在后一种情况下,编译器使用常量折叠来用精确的字符串替换printf。但在前一种情况下,它使用了长双精度中最接近的结果,这是你能得到的最好结果

请注意,对于长双精度结果,应该使用powl,而不是pow。在后一种情况下,它不仅是应该的,而且是必须的,因为%Lf将在参数中预期一个长的double,而不是double


要在运行时获得更精确的输出,您需要使用任意精度的数学库或自己构建一个。

在后一种情况下,编译器似乎使用常量折叠将printf替换为精确的字符串。但在前一种情况下,它使用了长双精度中最接近的结果,这是你能得到的最好结果

请注意,对于长双精度结果,应该使用powl,而不是pow。在后一种情况下,它不仅是应该的,而且是必须的,因为%Lf将在参数中预期一个长的double,而不是double


要在运行时获得更精确的输出,您需要使用任意精度的数学库,或者自己构建一个。

对于第二个版本,您会得到一个很好的结果,这令人惊讶。这是一种未定义的行为,因为您只提供了一个双参数,而printf要求使用long double哪个编译器、版本和开关?或者,研究将pow与long double一起使用。令人惊讶的是,对于第二个版本,您竟然得到了一个很好的结果。这是未定义的行为,因为当printf需要长double时,您只提供了一个double参数。哪个编译器、版本和开关?或者,研究将pow与长double一起使用。对常数折叠可能性的良好观察。对常数折叠可能性的良好观察。
#include <stdio.h>
#include <math.h>
int main()
{
    printf("10^100 = %Lf", pow(10, 100));
}