2017-03-20 2 views
1

C++을 사용하여 계열을 계산하려고합니다. 시리즈는 다음
series (궁금에게는)긴 이중 오버플로가 있지만 최대 표현 가능 값보다 작은 값

내 코드는 다음과 같다 :

#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.7k : 892

최대 값은 long double이며, STL numeric_limits에서 제공하는대로 : 1.18973e+4932입니다.

그러나 보다 낮기 때문에 (1+1.7^892)= 2.19.... × 10^308이므로 무한대로 간주해서는 안됩니다.

내 코드가 잘못되었습니다 (하지만 아주 잘 될 수도 있습니다). 아무도 왜 논의 된 코드가 왜 무한대로 밝혀 지는지 말해 줄 수 없습니까?

+0

: 당신은 컴퓨터에 소수점 연산 부동 리드가 반올림 오류를 혼합하는 것을 알 수 있습니까? (예 : [부동 소수점 연산이 깨졌습니까?] (http://stackoverflow.com/questions/588004/is-floating-point-math-broken)) 두 번째로, 코드를 단계별로 실행 해 보았습니다. 디버거? –

+0

그래, 부동 소수점 수학이 오류로부터 안전하지 않다는 것을 알았지 만, 그것은 문제가 아니었다. 아래를 보라. – Devolution

답변

4

long double 인수를 제공하려면 pow 대신 powl을 사용해야합니다.

현재 pow 전화에서 numeric_limits<double>::max()을 치고 있습니다.

대안으로 적절한 과부하가있는 std::pow을 사용해보십시오. 시작하려면

참조 http://en.cppreference.com/w/c/numeric/math/pow

+0

pow가 긴 double에 대해 과부하가되어 있지 않습니까? http://en.cppreference.com/w/cpp/numeric/math/pow – Devolution

+0

아니요. 링크를 참조하십시오. – Bathsheba

+2

귀하의 링크는 ''입니다. OP는''을 오버로드하고 있습니다 : http://en.cppreference.com/w/cpp/numeric/math/pow – NathanOliver

관련 문제