为啥这不是它应该的输出? [关闭]

Posted

技术标签:

【中文标题】为啥这不是它应该的输出? [关闭]【英文标题】:Why is the output of this not what it should be? [closed]为什么这不是它应该的输出? [关闭] 【发布时间】:2020-09-30 13:14:27 【问题描述】:

所以我有一个计算 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));

我得到了我应该得到的,即 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0000000。

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

【问题讨论】:

令人惊讶的是,您在第二个版本中获得了很好的结果。这是未定义的行为,因为您只提供 double 参数,而 printf 需要 long double 哪个编译器、版本和开关? 或者,研究 以使用 pow()long double 【参考方案1】:

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

注意您应该使用powl,而不是pow 作为long double 结果。在后一种情况下,不仅应该而且必须,因为%Lf 在参数中会期望long double,而不是double

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

【讨论】:

恒定折叠可能性的良好观察。

以上是关于为啥这不是它应该的输出? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的作业有逻辑错误? [关闭]

Java IO流中先关闭输出流还是先关闭输入流?为啥?

无法解释的页边距@页面顶部[关闭]

我认为这是一个编译器错误,这不应该影响我的代码,但它是 [关闭]

我为啥要学习和使用struts? [关闭]

为啥输出总是零? [关闭]