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
已经在其他地方声明,以及dQ
和x_
)。
我调用isnan
,因为代码奇怪地返回了一些NaN。起初,我认为问题是kdotr
无限,这可能是cos
的论点;但是,代码永远不会在Scos
失败,而是在某些Fs[ik]
失败。这对我来说没有意义,因为Fs
来自一个简单的总和(并且它被初始化为0)。
在C ++中有限术语之间的总和之后,你有没有想过要获得NaN
?
答案 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了。