# Testing floating point numbers for equality

• ulfaazmi
In summary, the problem is when the value of (r1o = r, and r2o=r), the result will be infinite,,,what the the probably test for this case?? I can't test floating point numbers for equality ( if r == 0.5 and r == -0.5). But, when running this program without test floating point, it is success. however, the result is not true because it should be infine value or missing.
ulfaazmi
Anybody can help me?? The problem is when the value of (r1o = r, and r2o=r), the result will be infinite,,,what the the probably test for this case?? I can't test floating point numbers for equality ( if r == 0.5 and r == -0.5). But, when running this program without test floating point, it is success. however, the result is not true because it should be infine value or missing.
This is my code :

Fortran:
Program EfieldEpotential
implicit none
integer,parameter :: ikind = selected_real_kind(p=15)
real (kind=ikind)::E1,E2,E,V,V1,V2
real :: k,r1o,r2o,q1,q2,r,r1,r2
integer :: i,n=100

! initial position
r1o = -0.5
r2o = 0.5
q1 = -1  ! the charge at r1o
q2 = 1   ! the charge at r2o
k = 9E+9

do i = 1,n
r  = -2.1 + real(i)*0.1
r1 = abs(r1o-r)
r2 = abs(r2o-r)
E1 = k*q1/r1**2
E2 = k*q2/r2**2
E  = E1+E2
V1 = k*q1/r1
V2 = k*q2/r2
V  = V1+V2

if ( r>2.1) then
stop 'Program End'
else
write(*,30) r,E,V
30 format(7x,f8.2,8x,E15.7,8x,E15.7)

end if
end do
End

Thank you.

Last edited by a moderator:
You have to test for r1 or r2 being smaller than a very small number, to see if it is near 0.

Second, your loop is quite strange. Either calculate the step size (instead of using a fixed value of 0.1) so that n = 100 points take you to r = 2.1, or calculate the value of n needed to get just the right number of points. Alternatively, you can use a do without a counter
Fortran:
do
! some code here
if (r > 2.1) exit
! some code here
end do

jim mcnamara, ulfaazmi and Nik_2213
"You have to test for r1 or r2 being smaller than a very small number, to see if it is near 0."

Or their absolute difference being less than 'baseline noise'...

Met this using HP Technical BASIC (Run under Unix on a plasma-screen 'luggable' with integral printer !), which, IIRC, had a totally-huge dynamic range for its FP variables, and a real-neat 'close enough' function to prevent near misses and infinite iterations ...

ulfaazmi
DrClaude said:
You have to test for r1 or r2 being smaller than a very small number, to see if it is near 0.

Second, your loop is quite strange. Either calculate the step size (instead of using a fixed value of 0.1) so that n = 100 points take you to r = 2.1, or calculate the value of n needed to get just the right number of points. Alternatively, you can use a do without a counter
Fortran:
do
! some code here
if (r > 2.1) exit
! some code here
end do
DrClaude said:
You have to test for r1 or r2 being smaller than a very small number, to see if it is near 0.

Second, your loop is quite strange. Either calculate the step size (instead of using a fixed value of 0.1) so that n = 100 points take you to r = 2.1, or calculate the value of n needed to get just the right number of points. Alternatively, you can use a do without a counter
Fortran:
do
! some code here
if (r > 2.1) exit
! some code here
end do

Nik_2213
It will depend on the application. I define something like; TAD = 1e-12.
Then I can use; If Abs( f1 – f2 ) < TAD Then equal.
Or ratiometric; If Abs( f1 / f2 – 1 ) < TAD Then equal.

scottdave and ulfaazmi
Try this function

C:
template<int DECIMALS> inline bool equals(float f1, float f2){
return (fabs(f1 - f2) < 1.0f / (10.0f * static_cast<float>(DECIMALS)));
}

...

if (equals<3>(f1, f2)) dostuff();

ulfaazmi
Baluncore said:
It will depend on the application. I define something like; TAD = 1e-12.
Then I can use; If Abs( f1 – f2 ) < TAD Then equal.
Or ratiometric; If Abs( f1 / f2 – 1 ) < TAD Then equal.

I have tried it and success. thank you very much.

Baluncore said:
It will depend on the application. I define something like; TAD = 1e-12.
Then I can use; If Abs( f1 – f2 ) < TAD Then equal.
Or ratiometric; If Abs( f1 / f2 – 1 ) < TAD Then equal.
I have used something along the same lines.

## 1. What is the best way to test floating point numbers for equality?

The most commonly used method for testing floating point numbers for equality is to use a tolerance or margin of error. This means that instead of checking for exact equality, we allow for a small difference between the two numbers to account for potential rounding errors.

## 2. Why can't we just use the "==" operator to compare floating point numbers?

The "==" operator checks for exact equality, which can be problematic for floating point numbers due to their imprecision. This is because floating point numbers are stored as binary fractions and can only approximate decimal numbers, leading to small rounding errors that can affect their equality.

## 3. How do we determine the appropriate tolerance for testing floating point numbers?

The appropriate tolerance depends on the precision needed for the specific application. Generally, a tolerance of 0.00001 or smaller is sufficient for most applications. However, for more precise calculations, a smaller tolerance may be needed.

## 4. Can we use absolute or relative tolerances for testing floating point numbers?

Both absolute and relative tolerances can be used for testing floating point numbers. Absolute tolerance means setting a fixed difference between two numbers, while relative tolerance means setting a percentage difference between two numbers. The choice between the two depends on the specific application and the desired level of precision.

## 5. Are there any other methods for testing floating point numbers for equality?

Yes, there are other methods such as using the "Math.abs()" function to compare the absolute difference between two numbers, or using the "Math.ulp()" function to compare the unit in the last place. However, these methods may not always be reliable and may require a deeper understanding of floating point numbers and their representation.

• Introductory Physics Homework Help
Replies
2
Views
267
• Programming and Computer Science
Replies
8
Views
1K
• Introductory Physics Homework Help
Replies
10
Views
2K
• Atomic and Condensed Matter
Replies
3
Views
1K
• Introductory Physics Homework Help
Replies
4
Views
2K
• Programming and Computer Science
Replies
3
Views
2K
• Introductory Physics Homework Help
Replies
2
Views
2K
• Computing and Technology
Replies
4
Views
958
• Programming and Computer Science
Replies
4
Views
4K
• Programming and Computer Science
Replies
5
Views
1K