赋值后的实际值与实际表达式不同
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 - 第二个是编译器警告很有用,打开它们并弄清楚它们的含义!
我正在翻译 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 - 第二个是编译器警告很有用,打开它们并弄清楚它们的含义!