2016-10-30 4 views
-1

다음 함수의 :예기치 않은 값 카탈루냐어의 상수

arbFloat catalan(){ 
    arbFloat output, n = 0, first, second; 
    std::string preComp, postComp; 
    do{ 
     preComp = resizeArbtoString(first); 
     first += (1.0/pow(2.0, 4.0 * n)) * (
       (- 1.0/(2.0 * pow(8.0*n + 2.0, 2.0))) + 
       (1.0/(4.0 * pow(8.0*n + 3.0, 2.0))) + 
       (- 1.0/(8.0 * pow(8.0*n + 5.0, 2.0))) + 
       (1.0/(8.0 * pow(8.0*n + 6.0, 2.0))) + 
       (-1.0/(16.0 * pow(8.0*n + 7.0, 2.0))) + 
       (1.0/(2.0 * pow(8.0*n + 1.0, 2.0))) 
       ); 
     postComp = resizeArbtoString(first); 
     n++; 
    } while(preComp != postComp); 
    n = 0; 
    do{ 
     preComp = resizeArbtoString(second); 
     second += (1.0/pow(2.0 , 12.0 * n)) * (
       (1.0/(16.0 * pow(8.0*n + 2, 2.0))) + 
       (1.0/(64.0 * pow(8.0*n + 3, 2.0))) + 
       (-1.0/(512.0 * pow(8.0*n + 5, 2.0))) + 
       (-1.0/(1024.0 * pow(8.0*n + 6, 2.0))) + 
       (1.0/(4096.0 * pow(8.0*n + 7, 2.0))) + 
       (1.0/(8.0 * pow(8.0*n + 1, 2.0))) 
       ); 
     postComp = resizeArbtoString(second); 
     n++; 
    } while(preComp != postComp); 

    output = (3.0*first) - (2.0*second); 

    return output; 
} 

이 코드는 Catalan's constant의 값을 계산하는 의미는. 나는 천천히 수렴하는 방정식에 비해 the method that quickly converges을 사용하고 있습니다.

arbFloat

100 소수 자릿수의 정밀도로 부스트 멀티 정밀 cpp_dec_float입니다 :

typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<100>> arbFloat 

이 기능 resizeArbtoString() 단순히 문자열 변수를 변환하고, 소수점 첫째와 소수점을 고려하여 크기를 조정 . 여기서는 중요하지 않으며 결과에 영향을 미치지 않는다는 것을 확인했습니다.

정밀도가 무시 될 때 무한 루프를 중지하기 위해 계산 전후에 first 값을 얻습니다 (변수 second과 동일). do-while 루프가 이것을 검사합니다. 이것은 그것을 반복적 인 방법으로 만듭니다.

두 개의 do-while 루프는 방정식 (아래 이미지)의 두 합계 값을 별도로 얻습니다. 그런 다음 output 변수는 첫 번째 합계에 3을 곱한 다음 두 번째 합계에 -2를 곱한 다음이를 더합니다.

이 함수의 값을 리턴한다 :

0.9159456632705320620288006061761625716626752650763000222738355046579667073981960968090933049341304381 

값 대신되어야 할 때 : 여기

난 참조 방정식

.915965594177219015054603514932384110774149374281672134266498119621763019776254769479356512926115106248574 

(정확한 constant valueOEIS 통해) 이 함수를 만들 때 :

Equation for quicker convergence towards Catalans Constant

왜 이것이 부정확 한 값을 반환합니까?

+1

정수 지수로 [pow] (http://stackoverflow.com/questions/25678481/why-does-pown-2-return-24-when-n-5-with-my-compiler-and)를 사용하지 마십시오. -os). 'pow' 함수는 부동 소수점 함수입니다. 사용자가 g ++의 특정 버전을 사용하는 몇 개의 게시물이 있습니다. 여기서'pow'는 정수 지수로 사용될 때 정확한 결과를주지 않을 것입니다. – PaulMcKenzie

답변

2

1.0/4096.0-1.0/4096.0이어야합니다.

+0

@Anonymous - 본문에서 내 의견을 읽으십시오. 'pow '사용과 관련하여 잠재적으로 다른 문제가 있습니다. – PaulMcKenzie

관련 문제