문제

참고 : 이미 읽었습니다 이 주제, 그러나 나는 그것을 이해하지 못하고 그것을 사용할 수있는 솔루션을 제공하지 않습니다. 나는 숫자 문제가 끔찍합니다.

사용자가 원하는 소수의 수수료에 PI를 생성하는 간단한 방법은 무엇입니까? 이것은 숙제를위한 것이 아니며 여기에 나열된 프로젝트 중 일부를 완료하려고합니다.

링크

도움이 되었습니까?

해결책

숫자를 계산하기위한 고전적인 알고리즘 pi Gauss-legendre 알고리즘입니다. 더 현대적인 알고리즘만큼 빠르지는 않지만 이해할 수 있다는 이점이 있습니다.

허락하다

a_0 = 1
b_0 = 1/Sqrt(2)
t_0 = 1/4
p_0 = 1

그 다음에

a_(n+1) = (a_n + b_n) / 2
b_(n+1) = Sqrt(a_n * b_n)
t_(n+1) = t_n - p_n * (a_n - a_(n+1))^2
p_(n+1) = 2 * p_n

그 다음에

pi =. (a_n + b_n)^2 / (4 * t_n)

여기 (=. 이 알고리즘은 "대략 동일"을 의미합니다.이 알고리즘은 2 차 수렴을 나타냅니다 (정확한 소수점 자리의 수는 각 반복마다 두 배로).

임의의 차량 산술 라이브러리를 발견하는 것을 포함하여 이것을 C#로 번역하기 위해 당신에게 맡길 것입니다.

다른 팁

당신이 말하는 주제 Taylor 시리즈를 사용하여 PI의 값을 계산하십시오. "Double F (int I)"기능을 사용하여 해당 주제에 쓴 기능을 사용하면 "I"용어 이후 PI의 값이 제공됩니다.

Pi를 계산하는이 방법은 속도가 느립니다. PI 빠른 알고리즘.

하나의 구현을 찾을 수도 있습니다 여기 그것은 pi를 nth 숫자로 계산합니다.

행운을 빕니다!

이 좋은 가이드를 자세히 살펴보면 :

병렬 프로그래밍 패턴 : .NET 프레임 워크를 사용하여 병렬 패턴 이해 및 적용 4

70 페이지에서 찾을 수 있습니다.이 귀여운 구현 (내 측면에서 약간의 변화가 있음) :

static decimal ParallelPartitionerPi(int steps)
{
    decimal sum = 0.0;
    decimal step = 1.0 / (decimal)steps;
    object obj = new object();
    Parallel.ForEach(Partitioner.Create(0, steps),
        () => 0.0,
        (range, state, partial) =>
            {
                for (int i = range.Item1; i < range.Item2; i++)
            {
                decimal x = (i + 0.5) * step;
                partial += 4.0 / (1.0 + x * x);
            }
            return partial;
        },
        partial => { lock (obj) sum += partial; });
    return step * sum;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top