问题描述
请考虑以下代码。
! test.f90
program test
use iso_fortran_env,only: INT64,REAL64
print *,real(0_INT64,REAL64)
print *,real(1000_INT64,real(huge(0_INT64),REAL64)
end program test
按以下方式用gfortran
进行编译时:
$ gfortran -Wconversion -std=f2008 test.f90
我收到以下警告:
test.f90:5:18:
5 | print *,REAL64)
| 1
Warning: Change of value in conversion from ‘INTEGER(8)’ to ‘REAL(8)’ at (1) [-Wconversion]
请注意,gfortran
对前两次转换感到满意,但对最后一次转换却不满意。
问题:上面显示的警告是gfortran
的预期行为吗?我认为在这三种情况中的任何一种情况下都不会发出警告,因为转换是由REAL(,INT64)
明确完成的。
这是我的gfortran
的版本信息:
$ gfortran --version
GNU Fortran (Ubuntu 9.3.0-10ubuntu2) 9.3.0
作为参考,ifort
会在没有任何投诉的情况下编译test.f90:
$ ifort -warn all -stand f08 test.f90
非常感谢您的任何评论或批评。
解决方法
@ dave_thompson_085在评论中的答案:
“ 0和1000可以在REAL64(甚至在REAL32)中精确表示。 HUGE(INT64)是9223372036854775807,但不能。 REAL64具有“尾数”的53位(实际上是有效位数),并且在减去符号并添加隐藏位之后,此位支持的幅度不到16个十进制数字。 9223372036854775807是19个十进制数字。这不是标准所要求的诊断,因此取决于每个“处理器”(编译器)如何处理。”
非常感谢,@ dave_thompson_085。