#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
为什么会出现这种差异?..请帮助..我无法找出问题
答案 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);
}