CFD Online Discussion Forums (http://www.cfd-online.com/Forums/)
-   Main CFD Forum (http://www.cfd-online.com/Forums/main/)

 effort8 March 5, 2012 04:03

Followings are fortran programming.

implicit none

real(8) :: a=0.78

print *,a

end

---> a=0.779999971389

I think a should be "0.7800000000...".
But there is some difference with exact a.

I would like to know what the problem is...

Thanks.

 Fabian82 March 5, 2012 04:16

If you write a floating point number in Fortran, it assumes that the number has single precision. If you assign this number to a double precision value, the additional digits are filled up with random values. So you should add an underscore and the desired precision the each number which is directly coded in your program. For example:

program test
implicit none

! this is equivalent to a = 0.78_4
real(8) :: a = 0.78

! this is better
real(8) :: b = 0.78_8

print*,a
print*,b
end program test

Output:
0.77999997138977051
0.78000000000000003

The small difference in the last number is due to fact that not all decimal fractions may be described by IEEE floating point number exactly. There's always a relative difference of approx 2**(-52) which relates to the number of bits of the mantisse.

In order to handle the precisions in Fortran in a flexible way, I suggest defining a parameter for each precision in use, i.e.

program test2
implicit none
integer, parameter :: rp = 8

real(kind=rp) :: a = 0.78_rp

print*,a
end program test2

 effort8 March 5, 2012 06:11

Thank-you