ifort 15中的意外行为

时间:2015-10-13 23:22:58

标签: fortran

我刚刚在ifort(IFORT)15.0.0 2014072

中遇到以下情况
program integerkinds
  use iso_fortran_env
  implicit none

  integer(kind=selected_int_kind(15)):: j15

  print *,'Selected Integer Kind 15:'
  print *, huge(j15)
  print *, int(huge(j15))
  print *, int(huge(j15),kind=selected_int_kind(15))

end program integerkinds

输出为

 Selected Integer Kind 15:
   9223372036854775807
          -1
   9223372036854775807

编译器不应该根据int()的参数自动选择正确的返回类型吗?这种意外行为让我花费了大约2500小时的计算时间:(

文档说明(第{9}页的http://nf.nci.org.au/facilities/software/intel_fortran_reference.pdf):

Argument Type                                        Result Type
INTEGER(1), INTEGER(2), INTEGER(4)                   INTEGER(4) 
INTEGER(1), INTEGER(2), INTEGER(4), INTEGER(8)       INTEGER(8) 

根据此表,Integer(8)作为参数应该给出Integer(8)作为结果类型,但输出给出-1。对我来说看起来像个错误,但是在我离开之前,我希望得到第二双眼睛并且知道开发人员。标准中是否有我忽略的要求-1作为返回值?

1 个答案:

答案 0 :(得分:5)

没有。该表是错误的或误导性的(多行,否则没有意义,可能反映出某些兼容性选项的行为变化,但如果是这样,我不知道它是什么选项)。在标准Fortran中,INT泛型内在函数的结果类型仅取决于KIND参数的存在和值。如果KIND参数不存在则结果具有默认整数种类,否则KIND参数指定结果的KIND。

在没有更改默认整数类型的编译选项的情况下,示例程序中第二次调用INT的参数值无法用该编译器的默认整数表示。您的代码不符合规定。

虽然文本没有实质性改变(除了可能变得更加混乱),但我注意到您链接到的文档很古老。