gpt4 book ai didi

c - C 的 pow() 中参数的精度

转载 作者:太空宇宙 更新时间:2023-11-04 07:32:52 25 4
gpt4 key购买 nike

这是一段C代码;

#include<stdio.h>
#include<math.h>
int main()
{
double n=10.0;
double automatic = pow(10.0,log10(n)-log10(5.0));
printf("%.9lf\n",log10(n)-log10(5.0));
printf("%.9lf\n",pow(10.0,0.30102996));
double manual = pow(10.0,0.30102996);
printf("%.9lf %lf\n",automatic, floor(automatic));
printf("%.9lf %lf\n",manual,floor(manual));
return 0;
}

输出是:

0.301029996
1.999999836
2.000000000 1.000000
1.999999836 1.000000

从输出我可以推断在 pow(x,y) 中 y 被四舍五入到 6 位数字因为它的签名是 pow(double x, double y) 所以 0.301029996 变成 0.301030 这就是为什么 automatic 的值是 2.000000000 否则这将与手册相同。

我的问题:

  1. 我的推断是否正确?
  2. 如果第一个问题的答案为真,那么我们如何绕过这种舍入以获得更准确的结果?

最佳答案

pow 不四舍五入到 6 位数字。它使用 double ,对于 IEEE double 是 52 位有效数字(大约 15 位小数)。它可能准确也可能不准确到该精度的最后一位数字,但通常很接近。

2 的 base-10 对数的精确值接近 0.301029995663981195213738894724(来源:Wolfram Alpha)。它是一个无理数,因此不能用任何数字系统(十进制或二进制)精确表示。

您的结果表明 log10(n)-log10(5.0) 返回的值比 0.30102996 更接近 2 的精确数学 base-10 log .您得到 1.999999836 的原因是您在用 0.30102996 替换它时手动降低了您的值的准确性。这不是四舍五入的值,顺便说一句 - 数 9。

您的调用 pow(10.0,log10(n)-log10(5.0)) 返回的结果略小于 2(如 所示code>floor),但足够接近以至于它在 9 个位置四舍五入为 2。使用 double 类型不会比这更好。

所以我不太明白“避免四舍五入”是什么意思。如果你不想让这个值变得不那么准确,不要手动将它四舍五入到 9 位,并且在复制它时当然不要遗漏任何数字;-)

关于c - C 的 pow() 中参数的精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11923048/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com