C :: Aufgabe #28
1 Lösung
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.
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:
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
/********************************************
* 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;
}
