title: Is There a Better Double-Precision Assignment in Fortran 90?
body: <p>In Fortran 90 (using gfortran on Mac OS X) if I assign a value to a double-precision variable without explicitly tacking on a kind, the precision doesn't "take."  What I mean is, if I run the following program:</p>
  
  <pre><code>program sample_dp
  
  implicit none
  
  integer, parameter :: sp = kind(1.0)
  integer, parameter :: dp = kind(1.0d0)
  
  real(sp) :: a = 0.
  real(dp) :: b = 0., c = 0., d = 0.0_dp, e = 0_dp
  
  ! assign values
  a = 0.12345678901234567890
  b = 0.12345678901234567890
  c = DBLE(0.12345678901234567890)
  d = 0.12345678901234567890_dp
  
  write(*,101) a, b, c, d
  101 format(1x, 'Single precision: ',  T27, F17.15, / &amp;
             1x, 'Double precisison: ', T27, F17.15, / &amp;
             1x, 'Double precision (DBLE): ', T27, F17.15, / &amp;
             1x, 'Double precision (_dp): ',  T27, F17.15)
  
  end program
  </code></pre>
  
  <p>I get the result:</p>
  
  <pre><code>Single precision:        0.123456791043282
  Double precision:        0.123456791043282
  Double precision (DBLE): 0.123456791043282
  Double precision (_dp):  0.123456789012346
  </code></pre>
  
  <p>The single precision result starts rounding off at the 8th decimal as expected, but only the double precision variable I assigned explicitly with _dp keeps all 16 digits of precision.  This seems odd, as I would expect (I'm relatively new to Fortran) that a double precision variable would automatically be double-precision.  Is there a better way to assign double precision variables, or do I have to explicitly type them as above?</p>