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

Why is the output of this not what it should be?

所以我有一个计算 10^100 的作业,结果必须使用 pow() 函数。所以这是代码:

#include <stdio.h>
#include <math.h>
int main()
{
    long double result;
    result = pow(10, 100);
    printf("10^100 = %Lf", result);
}

如果我将pow(10, 100)分配给result,显示的结果是100000000000000001590289110975991804683608085639452813897813275577478387721703810608。但是,如果我这样写代码=]:[=14

#include <stdio.h>
#include <math.h>
int main()
{
    printf("10^100 = %Lf", pow(10, 100));
}

我得到了我应该得到的,即10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000Y00000000000000000000000000000000000000000000000000000000000000来

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

似乎在后一种情况下,编译器使用constant folding 将printf 替换为exact 字符串。但在前一种情况下,它使用了 long double 中最接近的结果 ,这是你能得到的最好结果。

请注意,对于 long double 结果,您应该使用 powl,而不是 pow。在后一种情况下,它不仅是 should,而且 must,因为 %Lf 期望 long double,而不是 double 在参数中。

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