Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it necessary to append _kind to number literals in modern Fortran?

This might be stupid question but I'm a bit confused after some recent tests. I always thought the way Fortran deals with reals is the following (modern declaration):

program testReal

  implicit none

  integer, parameter :: rkind=8

  real(kind=rkind) :: a,b,c

  // Test 1
  a = 1
  b = 1.
  c = 1._rkind
  write(*,"(2(1xES23.15))") a, b, c

  // Test 2
  a = 1/2
  b = 1/2.
  c = 1./2.
  write(*,"(2(1xES23.15))") a, b, c

  // Test 3
  a = 3.3
  b = 1 * a
  c = 1. * a
  write(*,"(2(1xES23.15))") a, b, c

end program testReal

Apart from Test 2 - a everything evaulates the same. I always thought I have to put e.g. 1._rkind, 0.5_rkind, etc. after every real in order to make sure to fill the rest of the mantissa with zeros?

Is this just pure luck or is it really not neccessary anymore to attach the _rkind?

like image 726
Flo Ragossnig Avatar asked Oct 23 '25 19:10

Flo Ragossnig


1 Answers

Let's look first at Test 1. Here 1, 1. and 1._rkind are literal constants. 1 is an integer of default kind; 1. is a real of default kind; 1._rkind is a real of kind rkind (which could be the same kind as the default). These are all different things.

However, in this case what happens on the assignment is key. As a, b and c are all reals of kind rkind the corresponding right-hand sides are all converted to a real of kind rkind (assuming such a kind has greater precision than default kind). The conversion is equivalent to

a = REAL(1, rkind)
b = REAL(1., rkind)
c = 1._rkind

It just so happens that 1 and 1. are both, in your numeric model, convertable exactly to 1._rkind.

I won't touch on Test 2, as the differences are "obvious".

In Test 3, we have the literal constant 3.3 which is a real of default kind. Again

a = REAL(3.3, rkind)
b = REAL(1, rkind)*REAL(3.3, rkind)
c = REAL(1., rkind)*REAL(3.3, rkind)

due to where and how conversions happen. From this you can see that the results are reasonably the same and the arithmetic happens as real of kind rkind.

What you will notice is a difference

a = 3.3
b = 3.3_rkind

because the (mathematical) real number 3.3 is not exactly representable in your numeric model. And the approximations will differ with real of default kind and kind rkind.

In particular, there is no need to worry about "fill[ing] the rest of the mantissa with zeros".

like image 113
francescalus Avatar answered Oct 25 '25 21:10

francescalus