首页 > 解决方案 > C中 pow 的精度是否取决于参数的比例?

问题描述

我要维护的旧代码具有一个带有双精度类型变量 x 的函数。此变量包含以米为单位的位置。预计将保持毫米范围内的值,例如 0.0001 < x < 0.01。

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

// 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);

目标平台是 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

标签: cfloating-pointprecisionieee-754pow

解决方案


推荐阅读