Ok, "Berechnung" ist vielleicht nicht ganz das richtige Wort. Ich habe einen Viertelkreis der in einem Quadrat ist. Die Seitenlänge des Quadrates bzw. der Radius des Kreises sei 1. Ich kann nun per Zufallsgenerator Punkte in dieses Quadrat fallen lassen, und kann anhand der Anzahl der Punkte die innerhalb des Kreises sind ( x²+y² < r²) auf Pi rückrechnen (Pi=4*Anzahl_quadrat/Anzahl_kreis).
Nach 2 Milliarden Punkten bekomme ich immer 3,141559 heraus. 'n Kollege von mir hat das Programm mit Visual C (ich verwende natürlich gcc) getestet und bekommt überhaupt nur 3,14 heraus, der erst schwankt....
Ist das ein Genauigkeitsproblem des Zufallsgenerators oder ein Problem mit der Genauigkeit der Varaiblentypen? Kann man das statistisch/numerisch irgendwie beweisen das es nicht genauer als [ergebnis des beweises hier einsetzen] gehen kann? Gibt es Verbesserungsvorschläge für mein Programm? (Kompiliert mit gcc -o pi pi.c -lm)
Anmerkung: wenn ich statt random() rand() verwende sollte das Ergebnis eigentlich das gleiche sein, ich muss das aber erst noch testen...
Code:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
double x = 0;
double y = 0;
double anz_i = 0; //Anzahl Punkte im Kreis
double anz_o = 0; //Anzahl Punkte im Quadrat
double rad = 0;
double pi = 0;
int z = 0;
while ( z < 2147000000 )
{
x = (double)( random() );
y = (double)( random() );
x /= (double)( RAND_MAX );
y /= (double)( RAND_MAX );
anz_o++;
z++;
rad = sqrt( x*x + y*y );
if ( rad <= 1 )
anz_i++;
if ( ( z % 1000000 ) == 0 )
{
pi = ( 4. * anz_i ) / anz_o;
printf( "z: %6d, pi: %f\n", z/1000000, pi );
}
}
return 1;
}
Lesezeichen