C++を使用して系列を計算しようとしています。 シリーズがある:
(疑問のためのもの)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
値をk
:892
最大値a long double
は、 STL numeric_limits
によって提供されるように、1.18973e+4932
である。
(1+1.7^892)= 2.19.... × 10^308
は、10^4932
よりも低いので、無限大とはみなされません。
私のコードが間違っているわけではありませんが(それは非常にうまくいくかもしれませんが)、誰も私が説明したコードが、
:あなたはコンピュータ上の浮動小数点演算をすると、リードが丸め誤差を配合するだろうことを知っていますか? (例えば、[浮動小数点数の計算は壊れていますか?](http://stackoverflow.com/questions/588004/is-floating-point-math-broken))第2に、コードを1行ずつ進めてみましたか?デバッガ? –
ええ、私は浮動小数点数学がエラーから安全ではないことを知っていましたが、それは問題ではありませんでした。 – Devolution