C中的Pow精度是否取决于参数的大小?

问题描述

我要维护的旧版代码具有一个带有double类型变量x的函数。此变量包含以米为单位的位置。预期该值将保持在mm范围内,例如0.0001

然后我注意到了这样的代码中的注释:

// We will take the 6th power of this variable.
// Convert number to mm to get better accuracy.            
x /= 1.0e-3;
double y = pow(x,6.0);
  • 这有意义吗,当第一个参数的数量级为1时pow()的精度确实更好吗?考虑到我认为浮点数的工作方式,只要尾数没有达到极限,我就不会期望尾数的大小。
  • 一个缩小参数是否也应该大于1?
  • 奖金问题:第二个参数(幂)的值会影响精度吗?即是采用较高的功率而不是使用较小的功率?

目标平台是用于x86_64的Linux 3.10.x,我们使用GCC编译器版本4.9.3。

我尝试了一个小的测试程序,当使用大于或小于1的参数时,确实确实显示了较大(但仍然不是很明显)的错误,但这也可能是由输入和/或结果的方式引起的用浮点数表示?

#include <stdio.h>
#include <math.h>

void printpow(double d)
{
   double pow6 = pow(d,6.0);
   printf("% 8g ^ 6 = %.20g\n",d,pow6);
}

int main(int argc,char **argv)
{
   
   printpow(7.0e-10);
   printpow(7.0e-6);
   printpow(7.0e-3);
   printpow(7.0);
   printpow(7.0e3);
   printpow(7.0e6);
   printpow(7.0e10);
   return 0;
}

提供输出

7e-10 ^ 6 = 1.1764899999999995812e-55
7e-06 ^ 6 = 1.1764899999999999629e-31
0.007 ^ 6 = 1.1764900000000001195e-13
    7 ^ 6 = 117649
 7000 ^ 6 = 1.1764900000000000603e+23
7e+06 ^ 6 = 1.1764899999999999889e+41
7e+10 ^ 6 = 1.1764900000000000914e+65

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)