现在我正在处理在我之前从事该项目的人的 Fortran 代码。代码比较大,这里就不提供了。在这个代码的很多地方都有双精度值除以整数。IE:
double precision :: a,c
integer :: b
a = 1.0d0
b = 3
c = a/b
Run Code Online (Sandbox Code Playgroud)
这有时会导致比常规浮点数错误更严重的错误。我会为您复制粘贴其中一个这样的错误:3.00000032899483。对于他的目的来说,这是可以的,但对我来说,这个错误是可怕的。似乎fortran正在将实数除以整数,然后将数字放大到双精度,添加一些随机的东西。如果我会写,当然可以处理:
c = a/(real(b,8))
Run Code Online (Sandbox Code Playgroud)
所以,我可以做到,但是搜索他的所有代码需要很长时间。这就是为什么,我尝试以下一种方式重载 (/) 运算符:
MODULE divisionoverload
!-----------------------------------------------------
INTERFACE OPERATOR (/)
MODULE PROCEDURE real_divoverinteger
END INTERFACE OPERATOR ( / )
CONTAINS
!-----------------------------------------------------
DOUBLE PRECISION FUNCTION real_divoverinteger(a,b)
IMPLICIT NONE
DOUBLE PRECISION, INTENT (IN) :: a
INTEGER, INTENT(IN) :: b
real_divoverinteger = a/real(b,8)
END FUNCTION real_divoverinteger
END MODULE divisionoverload
Run Code Online (Sandbox Code Playgroud)
但是 gfortran4.8 给我的错误清楚地表明这与内在除法运算符冲突:
MODULE PROCEDURE real_divoverinteger
1
Error: Operator interface at (1) …Run Code Online (Sandbox Code Playgroud)