如何解决为什么输出的结果不应该如此?
所以我有一个分配要计算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。但是,如果我编写如下代码:
#include <stdio.h>
#include <math.h>
int main()
{
printf("10^100 = %Lf",pow(10,100));
}
我得到了我应该得到的东西,即10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000。
所以有人请解释为什么会发生这种情况以及如何避免这种情况?
解决方法
似乎在后一种情况下,编译器使用恒定折叠来用 exact 字符串替换printf。但是在前一种情况下,它使用的是长整型可表示的最近结果,这是您可以获得的最好结果。
请注意,对于长双精度结果,您应该使用powl
,而不是pow
。在后一种情况下,这不仅是应该,而且是必须,因为%Lf
将期望long double
,而不是double
要在运行时获得更精确的输出,您需要使用任意精度的数学库或自己构建一个库。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。