C ++ возвращает NaN после суммы

введите описание изображения здесьЯ запускаю следующий код:

    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).

С тобой когда-нибудь случалось NaN после суммы между конечными членами в C ++?

0

Решение

Проблема такого рода ВСЕГДА вызывается тем, что некоторые входные данные для вычисления либо являются «недействительными» (приводя к тому, что FPU генерирует NaN в качестве результата), либо используют «NaN» в качестве входных данных сами по себе.

В этом случае, имея быстрое сканирование всех выполняемых вами операций, кажется, что есть только операции, которые не генерируют NaN на основе (например) отрицательных входных данных (например, sqrt или log), поэтому я думаю, что или более ваших входных данных читают неинициализированные (или неправильно инициализированные) данные.

Я бы начал с проверки того, что все компоненты:

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

не NaN, Особенно x_[i][0,1,2],

Поскольку ваш код не является полноценным фрагментом кода, который может быть выполнен, и инициализация некоторой переменной отсутствует даже в фрагменте кода, никто из присутствующих здесь не сможет дать вам точного ответа о том, где в вашем коде происходит ошибка.

0

Другие решения

Хорошо, я заставляю код работать без NaNs.

Как отмечали некоторые комментаторы, могут быть проблемы с инициализацией. На самом деле, вместо использования напрямую Fs (который является членом большего класса — этот код сам является частью метода), я хранил суммы косинусов во временном массиве Fs_объявлен и инициализирован внутри метода (например, как Scos): теперь больше нет NaN.

0

По вопросам рекламы [email protected]