Длинные двойные переполнения, но значение меньше максимального представимого значения

Я пытаюсь вычислить ряд с использованием C ++.
Серия это:
серии (для тех, кто интересуется)

Мой код следующий:

#include <iostream>
#include <fstream>
#include <cmath> // exp
#include <iomanip> //setprecision, setw
#include <limits> //numeric_limits (http://en.cppreference.com/w/cpp/types/numeric_limits)

long double SminOneCenter(long double gamma)
{
using std::endl; using std::cout;
long double result=0.0l;
for (long double k = 1; k < 1000 ; k++)
{
if(isinf(pow(1.0l+pow(gamma,k),6.0l/4.0l)))
{
cout << "infinity for reached for gamma equals:   " << gamma <<  "value of k:  " << k ;
cout << "maximum allowed:   " <<  std::numeric_limits<long double>::max()<< endl;
break;
}

// CAS PAIR: -1^n = 1
if ((int)k%2 == 0)
{
result += pow(4.0l*pow(gamma,k),3.0l/4.0l) /(pow(1+pow(gamma,k)),6.0l/4.0l);
}
// CAS IMPAIR:-1^n = -1
else if ((int)k%2!=0)
{
result -= pow(4.0l*pow(gamma,k),3.0l/4.0l) /(pow(1+pow(gamma,k)),6.0l/4.0l);

//if (!isinf(pow(k,2.0l)*zeta/2.0l))
}
//              cout << result << endl;
}return 1.0l + 2.0l*result;
}

Вывод будет, например, с gamma = 1.7 :
бесконечность для гаммы равна: 1.7 ценность k: 892

Максимальное значение long double может представлять, как предусмотрено STL numeric_limits, является: 1.18973e+4932,

тем не мение (1+1.7^892)= 2.19.... × 10^308 что намного ниже, чем 10^4932так что это не должно рассматриваться как бесконечность.

Если мой код не ошибается (но это может быть очень хорошо), может кто-нибудь сказать мне, почему обсуждаемый код уходит в бесконечность, когда он не должен?

1

Решение

Вам нужно использовать powl скорее, чем pow если вы хотите поставить long double аргументы.

В настоящее время вы бьете numeric_limits<double>::max() в вашем pow звонки.

В качестве альтернативы рассмотрите возможность использования std::pow который имеет соответствующие перегрузки.

Ссылка http://en.cppreference.com/w/c/numeric/math/pow

4

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

Других решений пока нет …

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