C的pow()中参数的精度

问题描述 投票:0回答:1

这里是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,这就是为什么auto值为2.000000000否则将与手册相同。

我的问题:

  1. 我的推断正确吗?
  2. 如果第一个问题的答案是正确的,那么我们如何绕过此舍入以获得更准确的结果?
c precision math.h
1个回答
3
投票

pow不能四舍五入。它使用双精度,对于IEEE双精度是52位有效数(大约15个小数位)。以这种精度,它可能对最后一位数字可能不准确,但通常是接近的。

© www.soinside.com 2019 - 2024. All rights reserved.