Rundungsfehler
-
hallo!
ich habe ein problem mit folgendem programm:
#include <stdio.h> #include <math.h> double thrt(double); int main(void) { double step; double x; double k[4]; double y=1; double yrt; printf("\nenter stepsize:"); scanf("%lf", &step); for(x=1;x<=30;x=x+step) { yrt=thrt(y); k[0]=step*x*yrt; yrt=thrt(y+0.5*k[0]); k[1]=step*(x+0.5*step)*yrt; yrt=thrt(y+0.5*k[1]); k[2]=step*(x+0.5*step)*yrt; yrt=thrt(y+k[2]); k[3]=step*(x+step)*yrt; y=y+k[0]/3+k[1]/6+k[2]/6+k[3]/3; if(fmod(x,5)==0) printf("\nclaculated value:\tf(%f)=%f", x, y); } return(0); } /*----------------------------------------------------------*/ double thrt(double a) { double x; double n; int i; x=1; n=2; i=0; while(fabs(n-x)>0.0000000005) { n=x; x=x-(pow(x, 3)-a)/(3*pow(x, 2)); i++; } return(x); }
Es handelt sich um die implementierung des Runge-Kutta verfahrens ind 4. ordnung zur lösung eines anfangswertproblems.
Das programm sollte eigentloch für die werte x=5, x=10, x=15... x=30 die berechneten werte ausspucken, die if-abfrage ist meiner meinung nach auch richtig, allerdings funktionniert die ausgabe nicht. Wenn ich für die variable 'step' (schrittweite) einen wert kleiner als 0.25 eingebe, so wird nichts mehr ausgegeben. Ich habe mir daraufhin fmod(x, 5) ausgeben lassen und festgestellt, dass irgendwo im programm rundungsfehler entstehen, die dafür sorgen, dass fmod(x, 5) eben nie null, sondern beispielsweise 0.00999... zurückliefert.
Weiss jemand, wo diese fehler ihren ursprung haben und wie man sie beheben kann?
vielen dank im voraus,
DL
-
DarkListener schrieb:
Weiss jemand, wo diese fehler ihren ursprung haben und wie man sie beheben kann?
bei doubles wird ein riesiger wertebereich in 8 bytes gequetscht, darunter leidet die auflösung. vielleicht hilft dir das: http://www.swox.com/gmp/