长双溢出但值小于最大可表示值

时间:2017-03-20 15:53:37

标签: c++ infinity long-double

我尝试使用C ++计算系列。 该系列是:
series(对于那些想知道的人)

我的代码如下:

array

输出将是,例如#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

STL 892提供的long double可以表示的最大值为:numeric_limits

然而1.18973e+4932低于(1+1.7^892)= 2.19.... × 10^308,所以它不应被视为无穷大。

如果我的代码没有错(但很可能是这样),任何人都可以告诉我为什么讨论的代码在不应该的时候会变为无穷大?

1 个答案:

答案 0 :(得分:4)

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

目前,您正在numeric_limits<double>::max()来电中点击pow

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

参考http://en.cppreference.com/w/c/numeric/math/pow