C :: Aufgabe #28

1 Lösung Lösung öffentlich

Laufzeit-Berechnung von PI mittels BBP-Reihe

Anfänger - C von Sone - 05.01.2013 um 00:10 Uhr
Berechnen Sie PI mit der Bailey-Borwein-Plouffe-Formel (BBP-Reihe).

Extrahieren Sie dazu aus der Standardeingabe die Größe der Summenformel (im Wikipedia-Artikel: Das k) und berechnen Sie dann PI mit der Genauigkeit eines long double (und speichern Sie es selbstverständlich auch in einem).

Anschließend geben Sie die von ihnen berechnete Annäherung und die prozentuale Abweichung vom "echten", vor-berechneten PI an.

Lösungen:

vote_ok
von devnull (8870 Punkte) - 16.02.2015 um 09:02 Uhr

Konsolenausgabe:


$ ./bbp 3
k = 0 : 3.133333333333333333
k = 1 : 0.008089133089133089
k = 2 : 0.000164923924115101
k = 3 : 0.000005067220853859
BBP-Summe : 3.141592457567435382
pi Konstante : 3.141592653589793239
Abweichung % : 0.000006239585441885

Quellcode ausblenden C-Code
/********************************************
 * bbp.c      PI berechnen mit BBP-Reihe
 ********************************************/
#define _GNU_SOURCE
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <float.h>

#define STR(x) #x
#define FLD(x) "%." STR(x) "Lf"

int main(int argc, char **argv)
{
	long double sum, sumk;
	long double s1, s2, s3, s4;
	long double q8, q16;
	long double dev;
    int k, kmax;

    kmax=(argc>1)?atoi(argv[1]):10;
	q16 = 1.0L;
    sum = 0L;
    for (k=0; k<=kmax; k++) {
		q8 = 8.0L * k;
		s1 = 4.0L / (q8 + 1.0L);
		s2 = 2.0L / (q8 + 4.0L);
		s3 = 1.0L / (q8 + 5.0L);
		s4 = 1.0L / (q8 + 6.0L);
		q8++;
		sumk = (s1 - s2 - s3 - s4) / q16;
		sum += sumk;
		q16 *= 16.0L;
		printf("      k = %2d : " FLD(LDBL_DIG) "\n", k, sumk);
	}
	dev = (1.0L - sum/M_PIl)*100.0L;

	printf("   BBP-Summe : " FLD(LDBL_DIG) "\n", sum);
	printf("pi Konstante : " FLD(LDBL_DIG) "\n", M_PIl);
	printf("Abweichung %% : " FLD(LDBL_DIG) "\n", dev);
	return 0;
}