Precision of numbers in Fortran

So, we have a few ways of entering numbers in a Fortran program. Different ways of writing the number shows it’s precision. Thus,

0.5

means a REAL number of default KIND. By default, at least on the GNU compiler gfortran 4.6.1, KIND=4, which gives a 32-bit precision number, about 7 decimal places in Base 10. All of these also give the same value:

0.5
0.5_4
0.5e0

If one changes the default KIND, for example with the gfortran compiler option -fdefault-real-8, then the first and third of these change, but not the second, since it explicitly defines KIND=4.

An interesting side note about binary numbers. In different bases, different numbers are rational. Take 0.1. In our normal decimal system, 0.1 is obviously rational, as it can be represented by the division of two integers, 1/10. In binary, however, this number is not rational – it is repeating. So the more precision you have in your type, the better approximation to 1/10 you have.

Here’s the big point of my post. It pays to always explicitly declare the KIND of your constants. Example:

! Define pi. '4.0_8' means 'REAL number 4 with KIND=8'
real*8 :: pi = 4.0_8*atan(1.0_8)
write(*,*)pi
write(*,*)0.1*pi
write(*,*)0.1_8*pi

The first line uses the built-in inverse tangent function to compute pi up to the limit of machine precision. The last two lines really highlight my point. If you run these lines in a program, you’ll see that they give two different numbers.

This is the moral of the story.

Sidenote: When declaring KINDs of constants like this, be careful. 1_8 means the KIND=8 <em>INTEGER</em>, not the REAL. You need either a decimal point or scientific notation to get it to read as REAL.

Leave a Reply

Your email address will not be published. Required fields are marked *

     

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>