C ++中不可预测的输出

时间:2012-08-31 10:10:47

标签: c++

以下是源代码示例

#include <iostream.h>
#include <conio.h>
#include <math.h>
 int main()
{
    int i=2,a;
    a= pow(10,i);
    int b=0;
    b+=a;
    cout<<b;
    getch();
}

我希望的输出是100,因为很明显。但是编译器将99作为输出。任何人都可以解释代码中的问题是什么,以及如何纠正以100作为输出。

5 个答案:

答案 0 :(得分:2)

pow(10,i)是99.99999999999,然后被覆盖到整数a = 99

您也可以创建自己的pow(int,int)整数重载。

美好的一天。

答案 1 :(得分:2)

更改此行:

a = round(pow(10,i));

您可以将round函数编写为:

int round(double r) {
    return (r > 0.0) ? floor(r + 0.5) : ceil(r - 0.5);
}

注意: pow()会返回一个双精度数字,因此避免此类问题的最佳方法是将a加倍,而不是int

答案 2 :(得分:0)

更改FPU舍入模式。从圆形转换为零到圆形到最近。如何在C标准中定义,因此您需要使用一些内部指令或一些内联汇编程序。

答案 3 :(得分:0)

您需要使用ceil()double值舍入为整数,只需赋值与floor()相同 - 它会截断浮点double中的小数部分你的情况(正数)。您也可以发现数学四舍五入有用 - floor(x + 0.5)为正xceil(x - 0.5)为负数。

答案 4 :(得分:0)

pow的文档如下:

#include <math.h>
  double  pow (double x, double y)
  long    powl (long double x, long double y)
  float   powf (float x, float y)

所以pow(10, 2)double,可能会被计算为99.99999999999

所以你的行

a = pow(10, i)99.99999999999存储到int,因此发生了截断a变为99

cout之后尝试a = pow(10, i);来验证我的意思。

您可以通过将a声明为long来解决此问题。值得一试......

最好将pow的返回值存储为doublefloat,而不是int