Π 값을 가장 빠른 방법은 무엇입니까?

39 m, 가장 빠른 길은 π 값을 찾는 i& 입수합니다 등 개인 과제입니다. # 39 m, t, 좀 더 구체적으로 I& 있는 방법을 사용하여 don& # 39 와 같은 '또는' 정의 '' # 사용하여 mediaagent 상수입니다 M_PI 하드 코딩 수).

이 프로그램은 다양한 방법으로 테스트를 그러니까말이야 아래에 있다. 인라인 어셈블리 버전이, 이론적으로 가장 빠른 옵션에만 이동형이든지 표시되어도 확실히요 없습니다. # 39, ve 기준선부터 i& 아니라 다른 버전을 비교할 수 있습니다. 내장 기능 테스트 '를 통해 제 4 * atan (1)' 의 4.2 버전이 가장 빠른 자동 배 atan (1) '이' 때문에 mgcc 붙여넣습니다 상수입니다. '와' 파노 기본 제공 지정된 'atan2 (0, - 1)' 버전이 가장 빠른.

39 의 here& 주 테스트 프로그램 ('피타임s.c').

#include <math.h>
#include <stdio.h>
#include <time.h>

#define ITERS 10000000
#define TESTWITH(x) {                                                       \
    diff = 0.0;                                                             \
    time1 = clock();                                                        \
    for (i = 0; i < ITERS; ++i)                                             \
        diff += (x) - M_PI;                                                 \
    time2 = clock();                                                        \
    printf("%s\t=> %e, time => %f\n", #x, diff, diffclock(time2, time1));   \
}

static inline double
diffclock(clock_t time1, clock_t time0)
{
    return (double) (time1 - time0) / CLOCKS_PER_SEC;
}

int
main()
{
    int i;
    clock_t time1, time2;
    double diff;

    /* Warmup. The atan2 case catches GCC's atan folding (which would
     * optimise the ``4 * atan(1) - M_PI'' to a no-op), if -fno-builtin
     * is not used. */
    TESTWITH(4 * atan(1))
    TESTWITH(4 * atan2(1, 1))

#if defined(__GNUC__) && (defined(__i386__) || defined(__amd64__))
    extern double fldpi();
    TESTWITH(fldpi())
#endif

    /* Actual tests start here. */
    TESTWITH(atan2(0, -1))
    TESTWITH(acos(-1))
    TESTWITH(2 * asin(1))
    TESTWITH(4 * atan2(1, 1))
    TESTWITH(4 * atan(1))

    return 0;
}

그리고 인라인 어셈블리 stuff ('프레드피스크') 가 x86 용 및 x64 시스템을 사용할 수 있습니다.

double
fldpi()
{
    double pi;
    asm("fldpi" : "=t" (pi));
    return pi;
}

모든 구성, 구축 및 구축하십시오 스크립트입니다 I& # 39 m 테스트 ('build.sh').

#!/bin/sh
gcc -O3 -Wall -c           -m32 -o fldpi-32.o fldpi.c
gcc -O3 -Wall -c           -m64 -o fldpi-64.o fldpi.c

gcc -O3 -Wall -ffast-math  -m32 -o pitimes1-32 pitimes.c fldpi-32.o
gcc -O3 -Wall              -m32 -o pitimes2-32 pitimes.c fldpi-32.o -lm
gcc -O3 -Wall -fno-builtin -m32 -o pitimes3-32 pitimes.c fldpi-32.o -lm
gcc -O3 -Wall -ffast-math  -m64 -o pitimes1-64 pitimes.c fldpi-64.o -lm
gcc -O3 -Wall              -m64 -o pitimes2-64 pitimes.c fldpi-64.o -lm
gcc -O3 -Wall -fno-builtin -m64 -o pitimes3-64 pitimes.c fldpi-64.o -lm

다양한 컴파일러 플래그를 사이에 별도로 테스트 (ve) 에 비해 너무 최적화 때문에 32 비트, 64 비트 # 39 I& 다르다), the order of the 테스트를 했지만, 역시 이제는 I& # 39 스위칭이란 있다. 하지만, 그래도 'atan2 (0, - 1)' 버전을 기반으로 때마다 계속 나옵니다.

질문에 대한 의견 (16)
해결책

1, [몬테카를로 방법] 이 개념을 명확히 언급한 바와 같이, 굉장한 qic 가장 빠른 것이 아니라 모든 샷이 긴 가 아닌 가 아닌 합리적 제각각이었다. 또 어떤 종류의 정밀도에는 찾고 달려 있다. 이 중 가장 빠른 π 그러니까말이야 함께 자리 하드코딩된. 보고 [Pi] [2] 와 [Pi\ [PDF]] [3], 많아 육팔면체의 절반이다.

여기에 대한 빠른 시간 안에 모든 당 14 자리 이터레이션에 하는 방식이다. [피파스트] [4] 현재 가장 빠른 애플리케이션, FFT 는 이 공식을 통해. # 39, ll 그냥 i& 기록하십시오 formula, 이후 코드 간단합니다. 이 공식을 발견한 것은 거의 라마누잔 및 의해 발견된 코트노프스키. 실제로 그가 어떻게 자리 수 있도록 # 39 - isn& 계산됩니까 수십 억 t, 메서드입니다 무시하는. 이 식은 나누고, 그 이후 우리는 계승 거역한다면 오버플로입니다 빠르고, 다음 등 유리하다는 계산을 지연입니다 지루려면 약관보다.

enter 이미지 여기에 설명을!

enter 이미지 여기에 설명을!

여기서,

enter 이미지 여기에 설명을!

다음은 [브렌트 살라민 알고리즘입니다] [10]. , 와 b 는 한 때 위키백과 언급은 닫으십시오 &quot enough&quot. 그럼 (a + b) & # 178. / 4t 의 π 근사화를 될 것입니다. # 39 m, 잘 모르는 enough&quot 닫으십시오 i& "; 하지만 두 자리, from my 테스트를 한 이터레이션에 고말은 잡을라는데 2 루타, 3 개의 가지고 있는 것은 물론 15 잡을라는데 7 이 오류가 있을 수 있기 때문에 그에 따른 표현과 진정한 좀 더 정확한 계산을 할 수 있다.

let pi_2 iters =
    let rec loop_ a b t p i =
        if i = 0 then a,b,t,p
        else
            let a_n = (a +. b) /. 2.0 
            and b_n = sqrt (a*.b)
            and p_n = 2.0 *. p in
            let t_n = t -. (p *. (a -. a_n) *. (a -. a_n)) in
            loop_ a_n b_n t_n p_n (i - 1)
    in 
    let a,b,t,p = loop_ (1.0) (1.0 /. (sqrt 2.0)) (1.0/.4.0) (1.0) iters in
    (a +. b) *. (a +. b) /. (4.0 *. t)

마지막으로, 일부 pi (800 자리 숫자) 골프 어때? 160 자!

int a=10000,b,c=2800,d,e,f[2801],g;main(){for(;b-c;)f[b++]=a/5;for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a)for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b);}

[2]: http://functions.wolfram.com/Constants/Pi/ &quot pi"; [3]: http://functions.wolfram.com/PDF/Pi.pdf &quot pi formulas"; [4]: http://numbers.computation.free.fr/Constants/PiProgram/pifast.html &quot PiFast";

[10]: http://mathworld.wolfram.com/Brent-SalaminFormula.html &quot 브렌트 살라민 Formula";

해설 (2)

이 프로그램을 보면서 π 수치이며, i really like 때문에 자체 영역.

이오치치 (1988년): http://www0.us.ioccc.org/1988/westley.c";;;; a href = &quot &lt &gt westley.c&lt /a&gt.

&gt. 00 - _ - # define F&lt f oo -;; &gt. int main () {F_OO = 00, 00, F = OO (), printf (, 4.*-f/oo/oo 1.3f\n&quot &quot, %),} foo () &gt. { &gt. --- &gt. -------- &gt. ----------- &gt. ------------- &gt. -------------- &gt. -------------- &gt. --------------- &gt. --------------- &gt. --------------- &gt. --------------- &gt. -------------- &gt. -------------- &gt. ------------- &gt. ----------- &gt. ------- &gt. --- &gt. }

해설 (6)

39 의 일반적인 설명을 위한 기술로 here& pi 통계하는 중 고등학교 때 제가 접했다.

단지 이 정도로 간단한 것은 누구나 기억할 수 있다고 생각하기 때문에 공유하지는 무기한 总监和首席信息官完全了解 &quot Monte-Carlo&quot, 또한, 이 방법을 설명합니다. 즉, 통계적 방법으로 답을 하는 방법 ᅳ 도착한 즉시 데듀시브리 무순서 프로세스를 통해 t # 39 don& 것으로 보인다.

광장, 쓰다 그리는 사분면 (4 분의 1 은 반원) 안에 있는 광장 (사분면 radius 와 같은 면이 있기 때문에 가능한 한 많이 칠합니다 스퀘어 광장)

이제 이 광장에서 우 랜드 (즉, dart, 레코드 안의 임의의 점 어디든요 곳을 선택할 수 있다. 물론, 광장, 과연 그 안에 타고 있는 반원? 이 같은 사실은 기록하십시오.

여러 차례 이 프로세스를 반복할 수 있습니다 - 진실이며당신이 발견하리니 제거율 반원 내에서 총 숫자는 x 이 제거율 호출하십시오 대對 좋은 점.

이후 추론할 수 있는 영역 () 는 r 배 r, r r 배 circle 이 x 번 semi 영역, 즉 x 번 r 제곱). 따라서 x 4 번 부여하느뇨 pi 있습니다.

이는 결코 신속한 방법을 사용할 수 있습니다. 그러나 it& # 39 의 좋은 예는 몬테카를로 방법. 그리고 만약 당신이 둘러보거라, 그렇지 않으면 외부의 컴퓨팅 기술 등 많은 문제가 해결될 수 있다는 것을 알 수 있습니다.

해설 (1)

C++ 템플릿 버전이 있으며, 완성도 있는 이익을 위해 최적화된 컴퓨팅 오버클로킹된 근사화를 기 pi 는 컴파일 타임에 구축하십시오 작성되었으며, 인라인 하나의 가치.


#include 

template
struct sign
{
    enum {value = (I % 2) == 0 ? 1 : -1};
};

template
struct pi_calc
{
    inline static double value ()
    {
        return (pi_calc::value () + pi_calc::value ()) / 2.0;
    }
};

template
struct pi_calc
{
    inline static double value ()
    {
        return (sign::value * 4.0) / (2.0 * J + 1.0) + pi_calc::value ();
    }
};

template
struct pi_calc
{
    inline static double value ()
    {
        return 4.0;
    }
};

template
struct pi
{
    inline static double value ()
    {
        return pi_calc::value ();
    }
};

int main ()
{
    std::cout.precision (12);

    const double pi_value = pi::value ();

    std::cout 
해설 (4)

실제로 전체 there& # 39 의 책 (다른 것들 가운데) 를 위한 전용 파르게 \pi 계산 방법: # 39, & # 39, Pi 와 AGM& 의해 조너선, 피터 보르바인 ([support. dell. 아마존] [1]).

내가 아주 조금 아흐마 및 관련 알고리즘을 연구했다. # 39 의 it& 꽤 신기한 (단, 가끔 비 사소한).

단, 대부분의 현대 알고리즘을 구현할 수 있는 산술 연산 \pi 무라티프레시시온 합니다 라이브러리 (GMP 는 상당히 좋은 선택이 표시되어도 it& # 39 의 귈이예요 하도 마지막으로 사용한 것으로 it).

이 중 최고의 시간 복잡도 알고리즘 () 는 o (log (n) m (n)), 여기서 m (n) 는 두 정수의 곱으로 대한 시간 복잡도 n 비트 (m (n) = o (n log (n) 로그 (log (n))) 를 fft 기반 알고리즘을 있으며, 보통 한 자릿수 구현되어 있으며, 이러한 때 필요한 컴퓨팅용으로 \pi 알고리즘입니다 gmp).

단, 비록 수학 견하여 알고리즘을 않을 정도의, 알고리즘을 스스로가 보통 몇 줄의 의사코드의, 그리고 그들의 구현은 보통 아주 간단한 (무라티프레시시온 쓰지 않고 자신의 선택한 경우 산술 :-)).

[1]: http://www.amazon.com/PI-AGM-Analytic-Computational-Complexity/dp/047131515X/ &quot support. dell. Amazon";

해설 (0)
  • How to do - 이 중 최고의 방법은 바로 다음 질문에 대한 답변을 가장 적은 컴퓨팅 작업량의 *. # 39, 야, 너 마음에 don& 경우에도 그것은 PI 의 값을 얻을 것을 인정하게 가장 빠른 방법.

    • Pi 의 값을 얻을 수 있는 가장 빠른 방법이 있다.
  1. 을 좋아하는 프로그래밍 언어
  2. 는 수학 라이브러리 불러들입니다.
  3. 과 이미 정의된 것을 알 수 없다 - pi 는 사용 가능!

39 의 경우, 수학 라이브러리 단번에 don& 없다.

    • 보조 가장 빠른 길 (더 보편적인 솔루션) 이 있다.

pi 인터넷에서 조회할 수 있습니다. (예:

http://www.eveandersson.com/pi/digits/1000000 (1 만 자리. # 39 의 what& 너회의 부동 소수점 precisiontm? )

또는 수 있습니다.

http://3.141592653589793238462643383279502884197169399375105820974944592.com/

또는 수 있습니다.

http://en.wikipedia.org/wiki/Pi

39 의 it& 정말 빠르게 자리 찾기 위해 필요한 모든 것을 precisiontm 정의하여 사용하고 싶은 상수입니다 don& 그들이실천하는 소중한 CPU 시간 t # 39, 확실히 할 수 있습니다.

이 탓에 일부 있지만, 실제로는 다른 것은 오토메이티드 Pi 의 값을 계산할 경우 죽이려하겠어요 박으래도 및 실제 응용 프로그램에서. # 39 의 CPU 시간, 꽤 큰 될 그들이실천하는 wouldn&, t it? 적어도 난 don& # 39 를 알리기 위한 재 계산, t 지켜보리니 real application 이.

당담자님께 되길. op 유념하십시오 질문과대답: &quot, 가장 빨리 PI&quot 값을 얻을 수 있다.

해설 (0)

베프 공식 계산할 수 있습니다 n 번째 자리 - 기준 2 (또는 16 개) - 신경 쓰지 말라고 해도 않고도 이전 n-1 자리 함께 첫:)

해설 (0)

Pi 상수로, 난 항상 flfile. 아코스 (-1) 대신 '정의'.

해설 (1)

그냥 여기 있을 때 이 방정식입니다 구현하므로 완전성을 위해 한다.

계산하십시오 PI 의 피에트

오히려 더 좋은 프로그램을 만들고 있는 속성이 mbsa 는 precision 개선될 수 있다.

& # 39 의 Here 일부 언어 자체에 대한 통찰력을

해설 (0)

만약 이 문서는 은 [알고리즘입니다 벨라르] [2] 창조하 진정한, 그 중 하나가 될 것이라고 이 스피드리스트 사용할 수 있습니다. 데스크탑 PC 를 사용하여 창조하사 pi 를 2.7 조원으로으로 자리!

그는 그의 .and) 에 여기서 일하는

수고했어 벨라르 개척한 있습니다!

http://www.theregister.co.uk/2010/01/06/very_long_pi/

[2]: http://en.wikipedia.org/wiki/Bellard% 27s_formula

해설 (1)

이는 &quot classic"; 방법을 매우 쉽게 구축할 수 있습니다. 이 구현, 의 파이썬 (그리 빠르진 언어) 가 있다.

from math import pi
from time import time

precision = 10**6 # higher value -> higher precision
                  # lower  value -> higher speed

t = time()

calc = 0
for k in xrange(0, precision):
    calc += ((-1)**k) / (2*k+1.)
calc *= 4. # this is just a little optimization

t = time()-t

print "Calculated: %.40f" % calc
print "Costant pi: %.40f" % pi
print "Difference: %.40f" % abs(calc-pi)
print "Time elapsed: %s" % repr(t)

Here 자세한 내용을 확인하실 수 있습니다.

어쨌든 가장 빠른 방법은 pi 의 값을 정확히까지 많게는 운영까지도 파이썬 입니다.

from gmpy import pi
print pi(3000) # the rule is the same as 
               # the precision on the previous code

다음은 이 부분을 소스임을 시모프 don& # 39 는 코드가 많은 유용한 방법, pi, 내가 이 경우에 따라 주석문입니다 것 같지는 않다.

static char doc_pi[]="\
pi(n): returns pi with n bits of precision in an mpf object\n\
";

/* This function was originally from netlib, package bmp, by
 * Richard P. Brent. Paulo Cesar Pereira de Andrade converted
 * it to C and used it in his LISP interpreter.
 *
 * Original comments:
 * 
 *   sets mp pi = 3.14159... to the available precision.
 *   uses the gauss-legendre algorithm.
 *   this method requires time o(ln(t)m(t)), so it is slower
 *   than mppi if m(t) = o(t**2), but would be faster for
 *   large t if a faster multiplication algorithm were used
 *   (see comments in mpmul).
 *   for a description of the method, see - multiple-precision
 *   zero-finding and the complexity of elementary function
 *   evaluation (by r. p. brent), in analytic computational
 *   complexity (edited by j. f. traub), academic press, 1976, 151-176.
 *   rounding options not implemented, no guard digits used.
*/
static PyObject *
Pygmpy_pi(PyObject *self, PyObject *args)
{
    PympfObject *pi;
    int precision;
    mpf_t r_i2, r_i3, r_i4;
    mpf_t ix;

    ONE_ARG("pi", "i", &precision);
    if(!(pi = Pympf_new(precision))) {
        return NULL;
    }

    mpf_set_si(pi->f, 1);

    mpf_init(ix);
    mpf_set_ui(ix, 1);

    mpf_init2(r_i2, precision);

    mpf_init2(r_i3, precision);
    mpf_set_d(r_i3, 0.25);

    mpf_init2(r_i4, precision);
    mpf_set_d(r_i4, 0.5);
    mpf_sqrt(r_i4, r_i4);

    for (;;) {
        mpf_set(r_i2, pi->f);
        mpf_add(pi->f, pi->f, r_i4);
        mpf_div_ui(pi->f, pi->f, 2);
        mpf_mul(r_i4, r_i2, r_i4);
        mpf_sub(r_i2, pi->f, r_i2);
        mpf_mul(r_i2, r_i2, r_i2);
        mpf_mul(r_i2, r_i2, ix);
        mpf_sub(r_i3, r_i3, r_i2);
        mpf_sqrt(r_i4, r_i4);
        mpf_mul_ui(ix, ix, 2);
        /* Check for convergence */
        if (!(mpf_cmp_si(r_i2, 0) && 
              mpf_get_prec(r_i2) >= (unsigned)precision)) {
            mpf_mul(pi->f, pi->f, r_i4);
            mpf_div(pi->f, pi->f, r_i3);
            break;
        }
    }

    mpf_clear(ix);
    mpf_clear(r_i2);
    mpf_clear(r_i3);
    mpf_clear(r_i4);

    return (PyObject*)pi;
}
  • I 는 약간의 문제가 이덴테이션 EDIT:* 잘라내기 및 붙여넣기, 어쨌든, 소스 (here] 2 에서 찾을 수 있습니다.
해설 (0)

그러니까 가장 빠른 경우, 코드의 문자 의해 here& # 39 의 [골프스크리프트] (http://www.golfscript.com/golfscript/examples.html) 솔루션:


;''6666,-2%{2+.2/@*\/10.3??2*+}*`1000
해설 (0)

같은 machin 공식을 사용하여

176 * arctan (1/57) + 28 * arctan (1/239) - 48 * arctan (1/682) + 96 * arctan(1/12943) 

[; \left( 176 \arctan \frac{1}{57} + 28 \arctan \frac{1}{239} - 48 \arctan \frac{1}{682} + 96 \arctan \frac{1}{12943}\right) ;], for you TeX the World people.

실제 구성표가, 예를 들면 다음과 같습니다.

' (+ (- (+ ( 176 (atan (/ 1 57))) ( 28 (atan (/ 1 239tb)))) ( 48 (atan (/ 1 682)))) ( 96 (atan (/ 1 12943))))'

해설 (0)

의지가 있는 경우 근사화를 사용하는 것이 좋다 ',' 355 / 113 소수점 숫자, 계시한하나님께 기술입니까 추가된 6 의 정수 표현식에서는 사용 가능. # 39 의 that& 중요하지 않은 것처럼, 요즘 &quot 부동 소수점 연산 co-processor&quot. 모든 것은 매우 중요한 의미를 가질 수 있지만, 그가 한 번.

해설 (0)

Pi 는 정확히 3! [교수는 프 링크 (심슨 가족)]

39 한 게 아니라, s, C # 의 here& (.NET-Framework 필요).


using System;
using System.Text;

class Program {
    static void Main(string[] args) {
        int Digits = 100;

        BigNumber x = new BigNumber(Digits);
        BigNumber y = new BigNumber(Digits);
        x.ArcTan(16, 5);
        y.ArcTan(4, 239);
        x.Subtract(y);
        string pi = x.ToString();
        Console.WriteLine(pi);
    }
}

public class BigNumber {
    private UInt32[] number;
    private int size;
    private int maxDigits;

    public BigNumber(int maxDigits) {
        this.maxDigits = maxDigits;
        this.size = (int)Math.Ceiling((float)maxDigits * 0.104) + 2;
        number = new UInt32[size];
    }
    public BigNumber(int maxDigits, UInt32 intPart)
        : this(maxDigits) {
        number[0] = intPart;
        for (int i = 1; i < size; i++) {
            number[i] = 0;
        }
    }
    private void VerifySameSize(BigNumber value) {
        if (Object.ReferenceEquals(this, value))
            throw new Exception("BigNumbers cannot operate on themselves");
        if (value.size != this.size)
            throw new Exception("BigNumbers must have the same size");
    }

    public void Add(BigNumber value) {
        VerifySameSize(value);

        int index = size - 1;
        while (index >= 0 && value.number[index] == 0)
            index--;

        UInt32 carry = 0;
        while (index >= 0) {
            UInt64 result = (UInt64)number[index] +
                            value.number[index] + carry;
            number[index] = (UInt32)result;
            if (result >= 0x100000000U)
                carry = 1;
            else
                carry = 0;
            index--;
        }
    }
    public void Subtract(BigNumber value) {
        VerifySameSize(value);

        int index = size - 1;
        while (index >= 0 && value.number[index] == 0)
            index--;

        UInt32 borrow = 0;
        while (index >= 0) {
            UInt64 result = 0x100000000U + (UInt64)number[index] -
                            value.number[index] - borrow;
            number[index] = (UInt32)result;
            if (result >= 0x100000000U)
                borrow = 0;
            else
                borrow = 1;
            index--;
        }
    }
    public void Multiply(UInt32 value) {
        int index = size - 1;
        while (index >= 0 && number[index] == 0)
            index--;

        UInt32 carry = 0;
        while (index >= 0) {
            UInt64 result = (UInt64)number[index] * value + carry;
            number[index] = (UInt32)result;
            carry = (UInt32)(result >> 32);
            index--;
        }
    }
    public void Divide(UInt32 value) {
        int index = 0;
        while (index < size && number[index] == 0)
            index++;

        UInt32 carry = 0;
        while (index < size) {
            UInt64 result = number[index] + ((UInt64)carry 
해설 (0)

함께 복식:

4.0 * (4.0 * Math.Atan(0.2) - Math.Atan(1.0 / 239.0))

이는 정확한 최대 14 개의 소수점, 충분히 칠하려면 더블 (이 때문에 요소라고 할 수 있는 자리로 탄젠트를 잘립니다 부정확한 나머지 호).

또한,, # 39 의 3.14159265358979323846 &lt b&gt 셋, it& 3&lt /b&gt 아닌 64.

해설 (0)

계산하십시오 컴파일 타임에 PI 와 D.

(복사됨 에서 DSource.org)

/** Calculate pi at compile time
 *
 * Compile with dmd -c pi.d
 */
module calcpi;

import meta.math;
import meta.conv;

/** real evaluateSeries!(real x, real metafunction!(real y, int n) term)
 *
 * Evaluate a power series at compile time.
 *
 * Given a metafunction of the form
 *  real term!(real y, int n),
 * which gives the nth term of a convergent series at the point y
 * (where the first term is n==1), and a real number x,
 * this metafunction calculates the infinite sum at the point x
 * by adding terms until the sum doesn't change any more.
 */
template evaluateSeries(real x, alias term, int n=1, real sumsofar=0.0)
{
  static if (n>1 && sumsofar == sumsofar + term!(x, n+1)) {
     const real evaluateSeries = sumsofar;
  } else {
     const real evaluateSeries = evaluateSeries!(x, term, n+1, sumsofar + term!(x, n));
  }
}

/*** Calculate atan(x) at compile time.
 *
 * Uses the Maclaurin formula
 *  atan(z) = z - z^3/3 + Z^5/5 - Z^7/7 + ...
 */
template atan(real z)
{
    const real atan = evaluateSeries!(z, atanTerm);
}

template atanTerm(real x, int n)
{
    const real atanTerm =  (n & 1 ? 1 : -1) * pow!(x, 2*n-1)/(2*n-1);
}

/// Machin's formula for pi
/// pi/4 = 4 atan(1/5) - atan(1/239).
pragma(msg, "PI = " ~ fcvt!(4.0 * (4*atan!(1/5.0) - atan!(1/239.0))) );
해설 (1)

이 버전 (의 델파이) 것도 특별한 일이 아니다, 그러나 그것은 적어도 보다 버전 닉 호지 게시하기를 blogspot. 블로그:). 내 컴퓨터 작업을 수행하는 데 걸리는 값을 주고 약 16 초 억원으로으로 이터레이션에 3.1415926525879 (정확한 부품이 굵은체로).

program calcpi;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  start, finish: TDateTime;

function CalculatePi(iterations: integer): double;
var
  numerator, denominator, i: integer;
  sum: double;
begin
  {
  PI may be approximated with this formula:
  4 * (1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 .......)
  //}
  numerator := 1;
  denominator := 1;
  sum := 0;
  for i := 1 to iterations do begin
    sum := sum + (numerator/denominator);
    denominator := denominator + 2;
    numerator := -numerator;
  end;
  Result := 4 * sum;
end;

begin
  try
    start := Now;
    WriteLn(FloatToStr(CalculatePi(StrToInt(ParamStr(1)))));
    finish := Now;
    WriteLn('Seconds:' + FormatDateTime('hh:mm:ss.zz',finish-start));
  except
    on E:Exception do
      Writeln(E.Classname, ': ', E.Message);
  end;
end.
해설 (0)
  • 소유하십시오 근사화를 할 수 있는 가치가 π * 스케쳐내 계산이므로 후:
PI = 3.141592654

39 에 부여된 that& 아니라, 단 한마디의 근사화를 완전히 의결했다. # 39 에 의해 오프하도록 it& 조금 넘는 0.00000000004102. (4 개의 10 조분, 정보 <;;;;;; 10,000,000,000&lt sup&gt 4&lt /sup&gt /&lt sub&gt /sub>).

    • Mkl 스케쳐내 함께 할 수 있는 패키지, 컴퓨터 대수학 및 종이 또는 π 관심용 교도관님도요 연필모양 π& # 39 의 정확한 값을 사용하여, π.

진짜 원한다면, 이 공식을 하나의 재미있어요.

  • i - π = ln (-1) *
해설 (1)

크기가 작고 느리고, 다시 옛날 단어를 사용했습니다 또는 존재하지 않는 부동 소수점 연산을 할 수 있는 물건을 다음과 같습니다.

/* Return approximation of n * PI; n is integer */
#define pi_times(n) (((n) * 22) / 7)

39 응용 프로그램용으로 don& 많이 받아야 precisiontm (비디오 게임, 예를 들어), t, 이는 매우 빠르고 정확한지 부족합니다.

해설 (2)