赋值后的实际值与实际表达式不同

Real value after assignment different from the real expression

我正在翻译 Fortran 代码。 我在分配期间有一个奇怪的行为。我知道添加代码可能会很有帮助,但我无法添加确切的代码(我未获得授权)并且我没有成功复制它。

行如下(qk 是预定义的,qk1 不是):

   print*,"qk",qk     
   print*,"qk1",qk1
   QK1=QK
   print*,"qk",qk
   print*,"qk1",qk1

我打印了这些值:

    qk   21909779.000000000     
    qk1   6.44842193E+32
    qk   21909779.000000000     
    qk1   21909780.0 

重点是我希望 qk1 等于 qk...为什么它们不同? 当我尝试复制它时,显然我打印了相同的值。

因为我没有添加代码,所以我不希望得到准确的答案...有人知道要检查什么吗?

原因是如注释中所述,qk 是单精度,qk1 是双精度,并且在所需的值下,单精度实数之间的间距为 2:

Program one_out

  Use, Intrinsic :: iso_fortran_env, Only : real32, real64

  Implicit None

  Real( real64 ) :: qk64
  Real( real32 ) :: qk32

  qk64 = 21909779.0_real64
  qk32 = qk64

  Write( *, * ) 'qk64 = ', qk64
  Write( *, * ) 'qk32 = ', qk32

  Write( *, * ) '64 spacing ', Spacing( qk64 )
  Write( *, * ) '32 spacing ', Spacing( qk32 )

End Program one_out

ian@eris:~/work/stack$ gfortran -Wall -Wextra -fcheck=all -std=f2008 one_out.f90 
one_out.f90:11:9:

   qk32 = qk64
         1
Warning: Possible change of value in conversion from REAL(8) to REAL(4) at (1) [-Wconversion]
ian@eris:~/work/stack$ ./a.out
 qk64 =    21909779.000000000     
 qk32 =    21909780.0    
 64 spacing    3.7252902984619141E-009
 32 spacing    2.00000000    

这里最重要的一课始终是,始终使用隐式 None - 第二个是编译器警告很有用,打开它们并弄清楚它们的含义!