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作为输出。

更改此行:

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

pow(10,i) 是 99.99999999999,然后下限为整数 a=99

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

日安。

更改 FPU 舍入模式。从舍入到零到四舍五入到最接近。C 标准中没有定义如何执行此操作,因此您需要使用一些内在指令或一些内联汇编程序。

您需要

使用 ceil() 将值double舍入为整数,只是分配与 floor() 相同 - 在您的情况下,它是截断浮点数的小数部分double数字(正数(。您可能还会发现数学四舍五入很有用 - floor(x + 0.5)表示正xceil(x - 0.5)表示负四舍五入。

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 'ing a 后a = pow(10, i);来验证我的意思。

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

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

最新更新