Question

Someone wanting less precision would write

999    format ('The answer is x = ', F8.3)

Others wanting higher output precision may write

999 format ('The answer is x = ', F18.12)

Thus it totally depends on what the user desires. What is the format statement that exactly matches the precision used in the calculation? (Note, this may vary from system to system)

Était-ce utile?

La solution

It is a difficult question because you request "the precision of the calculation", which depends on so many factors. For example: if I solve f(x)=0 via Newton's method to a tolerance of 1E-6, would you want a format with seven digits?

On the other hand, if you mean the "highest precision attainable by the type" (e. g., double or single precision) then you can simply find the corresponding epsilon (machine eps, or precision) and use that as the format flag. If epsilon is 1E-15, then you can use a format flag that does not have more than 16 digits.

In Fortran you can use the EPSILON(X) function to get this number (the answer will depend on the type of X), the you can take the floor of the absolute value of the logarithm (base 10) of epsilon, and make that the number of decimals in your float representation.

For example, if epsilon is 1E-12, the log is -12, the abs is 12, and the floor is 12, so you want a format like 15.12F (12 decimals + 1 point + the zero + the sign = 15 places)

Autres conseils

The problem with floating point numbers is that there is no precision as such: only significant digits.

For instance, if you are calculating longitudes in real*1, near the UK, you'd be accurate to 6 decimal places but if you were in Colorado Springs, it would only be accurate to 4 decimal places. It would not make any sense to print the number in F format it is just rubbish after the 4th decimal place.

If you wish to print to maximum precision, print in E format. Since it is always n.nn..nEnn, you get all the significant digits.

Edit - user4050's query Try the following example

program main
   real intpart, multiplier
   integer ii

   multiplier = 1
   do ii = 1, 6
      intpart = 9.87654321
      intpart = intpart * multiplier
      print '(F15.7 E15.7 G15.8)', intpart, intpart, intpart
      multiplier = multiplier * 10
   end do
   stop
end program

What you will get is something like

      9.8765430  0.9876543E+01  9.8765430
     98.7654266  0.9876543E+02  98.765427
    987.6542969  0.9876543E+03  987.65430
   9876.5429688  0.9876543E+04  9876.5430 
  98765.4296875  0.9876543E+05  98765.430
 987654.3125000  0.9876543E+06  987654.31

Notice that the precision changes as the number gets bigger because a float only has 7 significant figures.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top