# 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 `KIND`s 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`.