Chudnovsky Algorithmus in C?
Ich versuche gerade den Chudnovsky Algorithmus in C zu implementieren um die nachkommastellen von Pi zu rechnen. Jedoch sind die häufigsten Ergebnisse immer nan, -nan, inf oder was wie 3.827783e-647. Ich hab auch verschiene print formate verwendet um das ergebnis auszugeben, aber da kam entweder 0.0000 oder inf raus.
Wie bekomm ich es hin das eine 'normale' Zahl rauskommt, quasi 3.14159...... usw.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
long double fact(long double n) {
long double fac = 1.00;
for (int i = 1; i<=n; i++) {
if (i) {
fac = fac * i;
}
}
return fac;
}
int main(int argc, char* argv[]) {
long double n, i;
long double sum, pi, term;
sum = 0.00;
pi = 0.00;
n = (atoi(argv[1]));
for (i=0; i < n; i++) {
term = (powl((-1.00), n) * fact(6.00*n) * (545140134.00*n + 13591409)) / (fact(3.00*n) * powl(fact(n), 3.00) * powl(640320.00, 3*n+3/2));
sum += term;
}
sum = sum * 12;
pi = 1 / sum;
printf("PI: %Lf\n", pi);
return 0;
}
1 Antwort
if (i) {
fac = fac * i;
}
Was soll denn das If hier tun?
for (int i = 1; i<=n; i++) {
Wenn du sowieso mit einem Double vergleichst, warum dann nicht auch ein Double als Zählvariable, im Endeffekt würdest du dir dadurch casts ersparen.
term = (powl((-1.00), n) * fact(6.00*n) * (545140134.00*n + 13591409)) / (fact(3.00*n) * powl(fact(n), 3.00) * powl(640320.00, 3*n+3/2));
Sollte hier nicht die Zählvariable irgendwo vorkommen?
powl((-1.00), n)
Mach doch ein en Check of n größer oder kleiner 0 ist, dann ersparst du dir die fehleranfällige Potenzberechnung. Oder wechsle einfach in jedem Schleifendurchlauf einmal das Vorzeichen.
Zu deinem Fehler: Wenn da Nan oder Infinity rauskommt, dann taucht das an irgendeinem Punkt im Programm auf und setzt sich dann fort. Wo das auftritt müsstest du herausfinden.
Auch kann es passieren, dass Zahlen womöglich zu groß oder zu klein werden und so zu diesem Fehler führen.