Long double 溢出但值小于最大可表示值

Long double overflows but value smaller than maximum representable value

我正在尝试使用 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

根据STLnumeric_limits的规定,along double可以表示的最大值是:1.18973e+4932.

但是 (1+1.7^892)= 2.19.... × 10^30810^4932 低很多,所以不应该被认为是无穷大。

假设我的代码没有错(但很可能是错的),谁能告诉我为什么讨论的代码在不应该的情况下求值为无穷大?

如果您想提供 long double 个参数,您需要使用 powl 而不是 pow

目前您正在 pow 通话中点击 numeric_limits<double>::max()

作为替代方案,请考虑使用具有适当重载的 std::pow

引用http://en.cppreference.com/w/c/numeric/math/pow