2017-03-20 2 views
1

C++を使用して系列を計算しようとしています。 シリーズがある:
series(疑問のためのもの)long doubleがオーバーフローしますが、表現可能な最大値よりも小さい値

私のコードは以下の通りである:

#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値をk892

最大値a long doubleは、 STL numeric_limitsによって提供されるように、1.18973e+4932である。

(1+1.7^892)= 2.19.... × 10^308は、10^4932よりも低いので、無限大とはみなされません。

私のコードが間違っているわけではありませんが(それは非常にうまくいくかもしれませんが)、誰も私が説明したコードが、

+0

:あなたはコンピュータ上の浮動小数点演算をすると、リードが丸め誤差を配合するだろうことを知っていますか? (例えば、[浮動小数点数の計算は壊れていますか?](http://stackoverflow.com/questions/588004/is-floating-point-math-broken))第2に、コードを1行ずつ進めてみましたか?デバッガ? –

+0

ええ、私は浮動小数点数学がエラーから安全ではないことを知っていましたが、それは問題ではありませんでした。 – Devolution

答えて

4

long double引数を指定する場合は、powではなくpowlを使用する必要があります。

現在、powコールにはnumeric_limits<double>::max()と打っています。

代わりに、適切な過負荷を持つstd::powを使用することを検討してください。で開始する

リファレンスhttp://en.cppreference.com/w/c/numeric/math/pow

+0

長いdoubleのためにpowがオーバーロードされるはずですか? http://en.cppreference.com/w/cpp/numeric/math/pow – Devolution

+0

いいえ、リンクを参照してください。 – Bathsheba

+2

あなたのリンクは ''です。 OPは、オーバーロードされている ''を使用しています:http://en.cppreference.com/w/cpp/numeric/math/pow – NathanOliver

関連する問題