C的pow()函数按头文件<math.h>不能正常工作</math.h>

时间:2010-08-18 06:16:37

标签: c floating-accuracy

我看到以下代码产生如下结果,任何关于为什么输出都是这样的想法?

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

int main() {
    int i = 0;
    for(i = 0; i < 10; i++) {
        printf("%d\t\t\t%d\t\t\t", i, (int)pow(10, i));    
        printf("%f\n", pow(10, i));
    }
    return 0;
}

输出:

0                       1                       1.000000

1                       10                      10.000000

2                       99                      100.000000

3                       1000                    1000.000000

4                       9999                    10000.000000

5                       100000                  100000.000000

6                       1000000                 1000000.000000

7                       9999999                 10000000.000000

8                       99999999                100000000.000000

9                       999999999               1000000000.000000

2 个答案:

答案 0 :(得分:2)

在转换为round()之前使用int函数,否则尾随数字将被截断。

答案 1 :(得分:2)

正如关于浮点数的其他十几个问题中的每一个一样:-),答案是并非所有数字都可以准确表示。

而且,即使他们可以表现出来,也可能会因为pow之类的问题而导致错误的结果。换句话说,无论操作上的错误有多小,如果你多次执行,错误就会变大。

尝试使用pow(10,4)或其他浮点指示符打印%.50f的返回值,我保证您会看到类似9999.9999999237623465而不是10000的内容

对于它的价值,在CygWin下的gcc 3.4.4下生成了正确的结果,因此您可能使用的是pow的不太精确的实现。