【问题标题】:C's pow() function as per header file <math.h> not working properly根据头文件 <math.h> 的 C 的 pow() 函数无法正常工作
【发布时间】:2010-08-18 06:16:37
【问题描述】:

我看到下面的代码产生了如下的结果,知道为什么输出是这样的吗?

#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

【问题讨论】:

标签: c floating-accuracy


【解决方案1】:

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

【讨论】:

  • 感谢您的输入,我忘记了 :)
【解决方案2】:

与 SO 上与浮点有关的十亿个其他问题中的每一个一样 :-),答案是并非所有数字都可以精确表示。

而且,即使它们 可以 被精确地表示,您也可能会从像 pow 这样的可能在循环中工作的东西得到不好的结果。换句话说,一个操作的错误再小,如果你做很多次,错误就会变大。

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

不管怎样,正确的结果是在 CygWin 下的 gcc 3.4.4 下产生的,因此您可能使用的是不太精确的 pow 实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多