3

这是源代码示例

#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输出。

4

5 回答 5

2

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

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

再会。

于 2012-08-31T10:14:17.557 回答
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.

于 2012-08-31T10:19:38.450 回答
0

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

于 2012-08-31T10:18:38.063 回答
0

您需要使用ceil()将值舍double入为整数,只需分配与floor()- 它在您的情况下截断浮点数的小数部分double(正数)。您可能还会发现进行数学舍入很有用 -floor(x + 0.5)对于正数xceil(x - 0.5)对于负数。

于 2012-08-31T10:21:07.580 回答
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)a也是如此double,并且可能被计算为99.99999999999

所以你的线

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

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

您也许可以通过声明along. 值得尝试...

最好将返回值存储pow为 a doubleor float,而不是 a int

于 2012-08-31T10:56:49.487 回答