다음 함수의 :예기치 않은 값 카탈루냐어의 상수
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
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 통해) 이 함수를 만들 때 :
왜 이것이 부정확 한 값을 반환합니까?
정수 지수로 [pow] (http://stackoverflow.com/questions/25678481/why-does-pown-2-return-24-when-n-5-with-my-compiler-and)를 사용하지 마십시오. -os). 'pow' 함수는 부동 소수점 함수입니다. 사용자가 g ++의 특정 버전을 사용하는 몇 개의 게시물이 있습니다. 여기서'pow'는 정수 지수로 사용될 때 정확한 결과를주지 않을 것입니다. – PaulMcKenzie