“ gfortran -Wconversion”的奇怪行为

问题描述

请考虑以下代码

! 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。