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];
            }
        }
    }

一开始只有一些声明和初始化(数组Fs已经在其他地方声明了,还有dQand x_)。

我打电话是isnan因为代码奇怪地返回了一些 NaN。起初,我认为问题在于kdotr走向无穷大,这将是cos; 但是,代码永远不会在 失败Scos,但在某些Fs[ik]. 这对我来说没有意义,因为Fs来自一个简单的总和(并且它被初始化为 0)。

你有没有碰巧NaN在 C++ 中的有限项之间求和?

4

2 回答 2

0

这类问题总是由计算的某些输入“无效”(导致 FPU 生成 NaN 作为结果)或使用“NaN”本身作为输入引起的。

在这种情况下,快速浏览您所做的操作,似乎只有基于(例如)负输入 [如 sqrt 或 log 会执行] 不生成 NaN 的操作,所以我的想法是或更多输入正在读取未初始化(或错误初始化)的数据。

我将首先检查以下所有组件:

 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

好的,我让代码在没有 NaN 的情况下工作。

正如一些评论者指出的那样,初始化可能存在问题。事实上,我没有直接使用Fs(它是一个更大的类的成员——这段代码本身就是方法的一部分),而是将余弦的总和存储在一个临时数组Fs_中,在方法内部声明和初始化(例如 like Scos):现在不再有 NaN。

于 2013-05-12T22:22:34.650 回答