小编Gog*_*rik的帖子

Fortran中双精度除以整数

现在我正在处理在我之前从事该项目的人的 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)

precision fortran division fortran90

2
推荐指数
1
解决办法
7749
查看次数

标签 统计

division ×1

fortran ×1

fortran90 ×1

precision ×1