"gfortran -Wconversion" 的奇怪行为
Strange behavior of "gfortran -Wconversion"
考虑以下代码。
! test.f90
program test
use iso_fortran_env, only: INT64, REAL64
print *, real(0_INT64, REAL64)
print *, real(1000_INT64, REAL64)
print *, real(huge(0_INT64), REAL64)
end program test
用gfortran
编译时,如下:
$ gfortran -Wconversion -std=f2008 test.f90
我收到以下警告:
test.f90:5:18:
5 | print *, real(huge(0_INT64), 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
19.1.127编译test.f90没有任何抱怨:
$ ifort -warn all -stand f08 test.f90
非常感谢您的任何意见或批评。
评论@dave_thompson_085回答:
“0 和 1000 可以在 REAL64 中精确表示(甚至在 REAL32 中)。 HUGE(INT64) 是 9223372036854775807,它不能。 REAL64 有 53 位用于 'mantissa'(实际上,有效数),在减去符号并添加隐藏位后,它支持略低于 16 位的十进制数字。 9223372036854775807 是 19 位十进制数字。这不是标准要求的诊断,因此由每个 'processor'(编译器)决定如何处理它。”
非常感谢,@dave_thompson_085。
考虑以下代码。
! test.f90
program test
use iso_fortran_env, only: INT64, REAL64
print *, real(0_INT64, REAL64)
print *, real(1000_INT64, REAL64)
print *, real(huge(0_INT64), REAL64)
end program test
用gfortran
编译时,如下:
$ gfortran -Wconversion -std=f2008 test.f90
我收到以下警告:
test.f90:5:18:
5 | print *, real(huge(0_INT64), 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
19.1.127编译test.f90没有任何抱怨:
$ ifort -warn all -stand f08 test.f90
非常感谢您的任何意见或批评。
评论@dave_thompson_085回答:
“0 和 1000 可以在 REAL64 中精确表示(甚至在 REAL32 中)。 HUGE(INT64) 是 9223372036854775807,它不能。 REAL64 有 53 位用于 'mantissa'(实际上,有效数),在减去符号并添加隐藏位后,它支持略低于 16 位的十进制数字。 9223372036854775807 是 19 位十进制数字。这不是标准要求的诊断,因此由每个 'processor'(编译器)决定如何处理它。”
非常感谢,@dave_thompson_085。