What is the fastest way to get the value of π?

后端 未结 23 1792
自闭症患者
自闭症患者 2020-11-28 00:33

I\'m looking for the fastest way to obtain the value of π, as a personal challenge. More specifically, I\'m using ways that don\'t involve using #define constan

23条回答
  •  陌清茗
    陌清茗 (楼主)
    2020-11-28 01:02

    Basically the C version of paperclip optimizer's answer, and much more simpilified:

    #include 
    #include 
    
    double calc_PI(int K) {
        static const int A = 545140134;
        static const int B = 13591409;
        static const int D = 640320;
        const double ID3 = 1.0 / ((double) D * (double) D * (double) D);
        double sum = 0.0;
        double b = sqrt(ID3);
        long long int p = 1;
        long long int a = B;
        sum += (double) p * (double) a * b;
        for (int k = 1; k < K; ++k) {
            a += A;
            b *= ID3;
            p *= (6 * k) * (6 * k - 1) * (6 * k - 2) * (6 * k - 3) * (6 * k - 4) * (6 * k - 5);
            p /= (3 * k) * (3 * k - 1) * (3 * k - 2) * k * k * k;
            p = -p;
            sum += (double) p * (double) a * b;
        }
        return 1.0 / (12 * sum);
    }
    
    int main() {
        for (int k = 1; k <= 5; ++k) {
            printf("k = %i, PI = %.16f\n", k, calc_PI(k));
        }
    }
    

    But for more simplification, this algorithm takes Chudnovsky's formula, which I can fully simplify if you don't really understand the code.

    Summary: We will get a number from 1 to 5 and add it in to a function we will use to get PI. Then 3 numbers are given to you: 545140134 (A), 13591409 (B), 640320 (D). Then we will use D as a double multiplying itself 3 times into another double (ID3). We will then take the square root of ID3 into another double (b) and assign 2 numbers: 1 (p), the value of B (a). Take note that C is case-insensitive. Then a double (sum) will be created by multiplying the value's of p, a and b, all in doubles. Then a loop up until the number given for the function will start and add up A's value to a, b's value gets multiplied by ID3, p's value will be multiplied by multiple values that I hope you can understand and also gets divided by multiple values as well. The sum will add up by p, a and b once again and the loop will repeat until the value of the loop's number is greater or equal to 5. Later, the sum is multiplied by 12 and returned by the function giving us the result of PI.

    Okay, that was long, but I guess you will understand it...

提交回复
热议问题