You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NAG Fortran编译器类型检查报错信息表述存疑咨询

Fortran编译报错相关疑问解答

问题详情

测试代码

program kinds_demo
  use iso_fortran_env, only: REAL64, INT32
  integer(int32), parameter :: n=10
  real(real64)    :: A(n, n)
  complex(real64) :: B(n, n)
  real(real64)    :: tr, u(n*n), v(n*n)

  a=1.0D0
  b=1.0D0
  
  call dcopy(n*n, a, 1, u, 1)
  call dcopy(n*n, b, 2, v, 1)
  
  tr=dot_product(u,v)

  print*,tr
  
end program kinds_demo

编译与报错

使用NAG Fortran编译器(Release 7.1(Hanzomon) Build 7114)执行编译命令:

nagfor -c -o kinds_demo.x kinds_demo.f90

得到报错:

Error: kinds_demo.f90, line 12: Inconsistent data type
COMPLEX(KIND(0d0)) (previously DOUBLE PRECISION) for argument 2 in
reference to DCOPY

疑惑点

  • NAG编译器中REAL64=2,报错信息为何未采用COMPLEX(2)(此前为REAL(2))的形式表述类型差异?
  • 已有资料强调double precision并非REAL64,为何NAG编译器将REAL64类型标注为DOUBLE PRECISION?

解答

关于类型表述形式的问题

NAG编译器在报错信息里优先采用和代码上下文关联更直观的类型描述方式:

  • KIND(0d0)是基于字面量推导的kind值,比直接写数字2更能让开发者快速关联到双精度类型的实际含义;
  • 对于COMPLEX类型,用COMPLEX(KIND(0d0))表述,既明确了kind属性,又避免了直接写数字可能带来的歧义——不同编译器对kind值的定义可能有差异,虽然NAG里REAL64=2,但其他编译器不一定遵循这个设定。

关于REAL64与DOUBLE PRECISION的标注问题

在NAG编译器的实现中,REAL64对应的kind值恰好和传统DOUBLE PRECISION类型的kind值完全一致(都是2)。编译器在这里用DOUBLE PRECISION作为REAL64的等效描述,是为了兼容开发者对传统Fortran类型的认知——毕竟DOUBLE PRECISION是Fortran标准里长期存在的类型声明方式,而REAL64是Fortran 2003才引入的标准化kind常量。

需要明确的是:标准层面REAL64是标准化的双精度实数kind常量,DOUBLE PRECISION是类型说明符,二者并非完全等同,但在NAG的具体实现中,它们指向了同一个kind值,所以编译器会在报错里用更易理解的DOUBLE PRECISION来辅助说明。

内容的提问来源于stack exchange,提问作者yarchik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 13:30:26