为什么这不是它应该的输出?
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
在参数中。
要在运行时获得更精确的输出,您需要使用任意精度的数学库或自己构建一个。
所以我有一个计算 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
在参数中。
要在运行时获得更精确的输出,您需要使用任意精度的数学库或自己构建一个。