cpp程序中出现意外输出

时间:2013-12-08 06:27:29

标签: c++

#include<iostream>
#include<math.h>
using namespace std;

int main()
{
    int temp = 0, n = 1100, x = 0, t2 = 0, l = 10;
    while(temp < n)
    {
        t2 = temp;

        temp += pow(l, ++x);

        cout << t2 << " " << temp << " " << x <<endl;

    }

    return(0);
}

获得的输出是:

0 10 1 
10 109 2
109 1109 3

但我希望输出:

0 10 1
10 110 2
110 1100 3

为什么会出现这种差异?..请帮助..我无法找出问题

2 个答案:

答案 0 :(得分:1)

不要将pow用于整数运算。尝试

#include<iostream>
#include<math.h>
using namespace std;

int main()
{
    int temp = 0, n = 1100, x = 0, t2 = 0, l = 10;
    while(temp < n)
    {
        t2 = temp;

        int t3 = 1, t4 = 0;
        ++x;
        while (t4++ < x) t3 *= l; 
        temp += t3;

        cout << t2 << " " << temp << " " << x <<endl;

    }

    return(0);
}

// or alternatively

#include<iostream>
#include<math.h>
using namespace std;

int main()
{
    int temp = 0, n = 1100, x = 0, t2 = 0, l = 10;
    while(temp < n)
    {
        t2 = temp;

        temp += floor(pow(l, ++x) + .5);

        cout << t2 << " " << temp << " " << x <<endl;

    }

    return(0);
}

答案 1 :(得分:0)

默认情况下pow returns double。这意味着当您使用表达式temp += pow(l, ++x);时,会有一个从double到int的隐藏转换,以匹配temp的类型。

双打没有精确的表示(如整数)。因此,100的double值可能类似于99.999999..99832。将此值转换为int时,仅考虑小数点前的数字。因此,100的相应值将为99。您可以通过添加一些非常小的值(如数学中的epsilon)来纠正这个问题:

while(temp < n)
{
    t2 = temp;
    double d = pow(l, ++x);
    cout << (int) d << endl;
    cout << (int) (d + 1e-10) << endl;  // 1е-10 is 0.0000000001

    temp += (int) (d + 1e-10);
}