假设我们有15个从a [0]到a [14]的数字满足:
a[0]=4
a[i]=pow(sqrt(a[i-1])*2-1, 2) for i>=1 and i<=14
我需要打印出从a [0]到a [14]的所有值,每个数字都在一行上,因此我编写了以下代码(C ++,Code :: Blocks):
#include <iostream>
#include <cmath>
using namespace std;
#define maxN 15
int i[maxN]; int n=15;
int main()
{
i[0]=2;
cout<<4<<endl;
for (int k=1; k<n; k++){
i[k]=i[k-1]*2-1;
cout<<pow(i[k],2)<<"\t"<<endl;
}
return 0;
}
结果是:
4
9
25
81
289
1089
4225
16641
66049
263169
1.05062e+006
4.1984e+006
1.67854e+007
6.71252e+007
2.68468e+008
最后五个数字不正确(由于整数溢出)。
在上面的“ for”循环中,我更改了
cout<<pow(i[k],2)<<"\t"<<endl;
至
cout<<(long) pow(i[k],2)<<"\t"<<endl;
这次,结果是:
4
9
24
81
289
1089
4224
16641
66048
263168
1050625
4198400
16785408
67125248
268468224
手动检查后,我意识到许多数字仍然不正确:24;4224; 66048; 263168;4198400;16785408; 67125248;268468224(它们全都比正确数字低1)。我应该怎么做才能解决这个问题?
我应该怎么做才能解决这个问题?
更改
cout<<pow(i[k],2)<<"\t"<<endl;
至
cout<<i[k]*i[k]<<"\t"<<endl;
pow
是浮点函数,可能不精确。请注意,您的情况有些奇怪:如果pow
使用64位IEEE-754双精度,则它应该为您的输入打印准确的数字。因此,也许您使用32位float
数字。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句