为什么我的代码输出不正确的结果?整数溢出?

Why does my code output incorrect results? Integer overflow?

假设我们从a[0]到a[14]有15个数满足:

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)。我应该怎么做才能解决这个问题?

1.05062e+006 和 1050625 是相同的值,但打印不同。 pow(i[k],2) returns a floating point type,这里没有发生整数溢出,而是在将这样的浮点数转换为long.

时进行了舍入

格式Xe+Y称为科学计数法,其值为X * 10 ^ Y。默认情况下,std::printfstd::ostream::operator<< 打印超出其科学记数法特定界限的浮点值。有关详细信息,请参阅 https://en.cppreference.com/w/cpp/io/manip/fixed

What should I do to fix this?

改变

cout<<pow(i[k],2)<<"\t"<<endl;

cout<<i[k]*i[k]<<"\t"<<endl;

pow 是一个浮点函数,可能不精确。请注意,在您的情况下有些奇怪:如果 pow 使用 64 位 IEEE-754 双打,它应该为您的输入打印准确的数字。所以也许你使用 32 位 float 数字。