为啥这不是它应该的输出? [关闭]
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
。似乎在后一种情况下,编译器使用 constant fold 将 printf 替换为 exact 字符串。但在前一种情况下,它使用 long double 中可呈现的最接近结果,这是你能得到的最好结果。
注意您应该使用powl
,而不是pow
作为long double 结果。在后一种情况下,不仅应该而且必须,因为%Lf
在参数中会期望long double
,而不是double
。
要在运行时获得更精确的输出,您需要使用任意精度的数学库或自己构建一个。
【讨论】:
对恒定折叠可能性的良好观察。以上是关于为啥这不是它应该的输出? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章