C ++在求和后返回NaN

时间:2013-05-12 21:36:13

标签: c++ nan cosine

enter image description here我正在运行以下代码:

    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已经在其他地方声明,以及dQx_)。

我调用isnan,因为代码奇怪地返回了一些NaN。起初,我认为问题是kdotr无限,这可能是cos的论点;但是,代码永远不会在Scos失败,而是在某些Fs[ik]失败。这对我来说没有意义,因为Fs来自一个简单的总和(并且它被初始化为0)。

在C ++中有限术语之间的总和之后,你有没有想过要获得NaN

2 个答案:

答案 0 :(得分: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]

由于您的代码不是完整的可执行代码,并且某些变量的初始化甚至不在代码片段中,因此这里的任何人都无法准确地回答代码中的位置。错误。

答案 1 :(得分:0)

好的,我让代码在没有NaN的情况下运行。

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