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

sca*_*ana 1 fortran variable-assignment

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

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

   print*,"qk",qk     
   print*,"qk1",qk1
   QK1=QK
   print*,"qk",qk
   print*,"qk1",qk1
Run Code Online (Sandbox Code Playgroud)

我打印了这些值:

    qk   21909779.000000000     
    qk1   6.44842193E+32
    qk   21909779.000000000     
    qk1   21909780.0 
Run Code Online (Sandbox Code Playgroud)

关键是我希望 qk1 等于 qk ......为什么它们不同?当我尝试复制它时,显然我得到了相同的值。

由于我没有添加代码,因此我不希望得到准确的答案……有人知道要检查什么吗?

Ian*_*ush 6

原因是如注释中所示,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    
Run Code Online (Sandbox Code Playgroud)

这里最重要的教训总是,总是使用隐式无 - 第二个是编译器警告很有用,打开它们并找出它们的含义!

  • 我可能会写这样的内容:“松散地,值 21909779 落在附近的_可表示数字_之间的间隙中。这个间隙是指的间距:21909778 和 21909780 之间的间距为 2,不可能准确地分配该值21909779”。但这有点垃圾,没有像样的链接。 (2认同)