Solve Floating Point Error: 4th Order Runge-Kutta Method

AI Thread Summary
The discussion revolves around a program designed to solve the differential equation dy/dx = x^2 + y^2 using the fourth-order Runge-Kutta method, specifically for the case where y(0) = 0 and h = 0.2, aiming to find y(0.4). The program encounters a "Floating point overflow" error and does not exit the while loop as intended. Participants identify that the loop condition relies on x2 being exactly 0.4, which is problematic due to the nature of floating-point arithmetic. Suggestions include using a comparison that checks if x2 is greater than or equal to 0.4 instead of an exact match. The importance of avoiding direct float comparisons is emphasized, recommending the use of a threshold for comparisons. The discussion concludes with acknowledgment of the insights gained regarding handling floating-point values in programming.
Vagrant
Messages
195
Reaction score
1
This is a program to slove differential equation using fourth order Runge-Kutta method. The question is dy/dx=x2+y2
when y(0)=0, h=0.2
find y(0.4) (Ans= 0.021360)

#include<stdio.h>
#include<conio.h>
float f(float x, float y)
{
return (x*x+y*y);
}
void main()
{
float x1,y1,x2,y2,h=0.2,m1,m2,m3,m4;
clrscr();
printf("Enter the initial values of x and y\n");
scanf("%f%f",&x1,&y1);
while(1)
{
m1=f(x1,y1);
m2=f(x1+h/2,y1+(m1*h)/2);
m3=f(x1+h/2,y1+(m2*h)/2);
m4=f(x1+h,y1+m3*h);
y2=y1+(h/6)*(m1+(2*m2)+(2*m3)+m4);
x2=x1+h;
if(x2==0.4)
break;
else
{
x1=x2;
y1=y2;
}
}
printf("The value of y at x= 0.4 is %f\n",y2);
getch();
}

However this program is not working and giving the message Abnormal value: Floating point overflow. Can anyone please find out the error in this?
Thanks
 
Technology news on Phys.org
right away i notice that you will never get out of that while(1) loop unless x2==0.4
is that guaranteed to happen for every possible input?
if not, you've got an infinite loop. bad.
 
No, it will only be satisfied for this particular question, i.e. initial value of x=0, h=0.2.
It's not a very good program but it should work at least for this case, which it is not doing.
 
These are float values, chances that x2 will be EXACTLY 0.4 are slim.

You should get information about the line where the error occurs. If you don't have a debugger that will let you trace code step by step, put something like printf("x2 = %f\n") into code to see how x2 values change. You may check every variable this way.
 
I did that. The loop is not stopping after x2=0.4, why is break not working?
 
Try if (x>=0.4).
 
Yes, it works now.

Borek said:
These are float values, chances that x2 will be EXACTLY 0.4 are slim.
Was this the problem?

Thank you.
 
shramana said:
Was this the problem?

As you see. Generally you can't compare floats with x==y, rather with abs(x-y)<treshold.
 
I'll keep this in mind from now on. Thank you for the time and effort you put into this.
 

Similar threads

Back
Top