0

ここに画像の説明を入力次のコードを実行しています。

    double Scos [61][61][61] = {0};
    double kdotr;
    int ik;
    int howmany [34] = {0};
    auto Fs_ = initializer_list<int>({0});
    copy(Fs_.begin(), Fs_.end(), Fs);

    for ( size_t z=0; z<5; ++z )
    {
        for ( size_t y=0; y<5; ++y )
        {
            for ( size_t x=0; x<10; ++x )
            {
                for ( int k1=0; k1<=60; ++k1 )
                {
                    for ( int k2=0; k2<=60; ++k2 )
                    {
                        for ( int k3=0; k3<=60; ++k3 )
                        {
                            int i = x+y*10+z*50;
                            kdotr = (double)dQ*( (k1-30)*(x_[i][0]-x) + (k2-30)*(x_[i][1]-y) + (k3-30)*(x_[i][2]-z) );
                            if ( isnan(kdotr) )
                                cout << "kdotr " << k1 << " " << k2 << " " << k3 << endl;
                            Scos[k1][k2][k3] += (double)cos(kdotr);
                            if ( isnan(Scos[k1][k2][k3]) )
                                cout << "Scos "  << k1 << " " << k2 << " " << k3 << endl;
                        }
                    }
                }
            }
        }
    }

    for ( int k1=0; k1<=60; ++k1 )
    {
        for ( int k2=0; k2<=60; ++k2 )
        {
            for ( int k3=0; k3<=60; ++k3 )
            {
                double k = (double)dQ*sqrt( pow((k1-30),2) + pow((k2-30),2) + pow((k3-30),2) );
                ik = round(k/0.1);
                Fs[ik] += Scos[k1][k2][k3];
                if ( isnan(Fs[ik]) )
                    cout << "Fs[ik] " << k1 << " " << k2 << " " << k3 << endl;
                ++howmany[ik];
            }
        }
    }

最初に、いくつかの宣言と初期化があります ( arrayは、 andFsと共に、別の場所で既に宣言されています)。dQx_

isnanコードが奇妙にいくつかの NaN を返すため、呼び出しを行いました。最初は、問題はkdotr無限大になることにあると信じていましたcos。ただし、コードは で失敗することはありませんScosが、いくつかの で失敗しますFs[ik]Fsこれは単純な合計に由来するため(そして0に初期化されているため)、私には意味がありません。

NaNC++ で有限項間の和を求めたことがありますか?

4

2 に答える 2

0

この種の問題は常に、計算への何らかの入力が「無効」である (FPU が結果として NaN を生成する) か、入力自体として「NaN」を使用することによって発生します。

この場合、実行する操作をすばやくスキャンすると、(たとえば) 負の入力に基づいて NaN を生成しない操作しかないように思えます [sqrt や log が行うように]、私の考えはその 1 つです。または、より多くの入力が初期化されていない (または正しく初期化されていない) データを読み取っています。

まず、次のすべてのコンポーネントを確認することから始めます。

 x_[i][0]-x) + (k2-30)*(x_[i][1]-y) + (k3-30)*(x_[i][2]-z

ありませんNaN。特にx_[i][0,1,2]

あなたのコードは実行可能なコードの完全な部分ではなく、一部の変数の初期化はコード スニペットにも含まれていないため、コードのどこで問題が発生しているかについて正確な回答を提供することは誰にも不可能です。

于 2013-05-12T22:04:47.380 に答える
0

OK、NaN なしでコードが機能するようにします。

一部のコメンターが指摘したように、初期化に問題がある可能性があります。実際、(より大きなクラスのメンバーである - このコード自体がメソッドの一部である) を直接使用する代わりに、メソッド内で宣言および初期化さFsれた一時的な配列にコサインの合計を格納しました(例: のように): now NaN はもうありません。Fs_Scos

于 2013-05-12T22:22:34.650 に答える