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

Click For Summary

Discussion Overview

The discussion revolves around a programming issue related to implementing the fourth order Runge-Kutta method for solving a differential equation. Participants focus on debugging a specific code snippet that encounters a floating point overflow error and issues with loop termination.

Discussion Character

  • Technical explanation
  • Debate/contested
  • Mathematical reasoning

Main Points Raised

  • One participant notes that the while loop will only terminate if x2 equals 0.4, questioning whether this condition is guaranteed for all inputs.
  • Another participant points out that achieving an exact float comparison (x2 == 0.4) is unlikely due to the nature of floating point representation.
  • A suggestion is made to modify the condition to check if x2 is greater than or equal to 0.4 instead of checking for equality.
  • Participants discuss the importance of using a threshold for comparing floating point numbers, suggesting that abs(x - y) should be less than a certain threshold instead of direct equality.

Areas of Agreement / Disagreement

Participants generally agree on the issues related to floating point comparisons and the potential for infinite loops in the code. However, there is no consensus on the underlying cause of the floating point overflow error, as it has not been explicitly addressed in the discussion.

Contextual Notes

The discussion highlights limitations in the original code regarding loop termination and floating point comparisons, but does not resolve the specific cause of the floating point overflow error.

Who May Find This Useful

Readers interested in numerical methods, programming in C, debugging techniques, and handling floating point arithmetic may find this discussion relevant.

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)<threshold.
 
I'll keep this in mind from now on. Thank you for the time and effort you put into this.
 

Similar threads

  • · Replies 15 ·
Replies
15
Views
3K
  • · Replies 16 ·
Replies
16
Views
3K
  • · Replies 2 ·
Replies
2
Views
4K
  • · Replies 1 ·
Replies
1
Views
3K
Replies
3
Views
3K
  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 2 ·
Replies
2
Views
3K
  • · Replies 6 ·
Replies
6
Views
1K
  • · Replies 7 ·
Replies
7
Views
3K