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 ......为什么它们不同?当我尝试复制它时,显然我得到了相同的值。
由于我没有添加代码,因此我不希望得到准确的答案……有人知道要检查什么吗?
原因是如注释中所示,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)
这里最重要的教训总是,总是使用隐式无 - 第二个是编译器警告很有用,打开它们并找出它们的含义!