首页 > 解决方案 > Fortran 函数有时会返回 NaN

问题描述

我一直在使用一些软件调用 auto-07p 来解决数学问题。auto 使用 fortran 90 函数文件来描述我要解决的方程。我的问题是,对于我的代码中的一个函数,它没有始终如一地返回相同的值,并且有时会为完全相同的输入返回 NaN。我的功能是:

FUNCTION RESISTANCE(H,D,L,VISP)
 DOUBLE PRECISION :: RESISTANCE
 DOUBLE PRECISION :: H
 DOUBLE PRECISION :: D
 DOUBLE PRECISION :: L
 DOUBLE PRECISION :: VISP
 DOUBLE PRECISION C, MU45, VIS
 MU45=6*EXP(-0.085*D)+3.2-2.44*EXP(-0.06*D**0.645)
 C=(0.8+EXP(-0.075*D))*(-1 + 1/(1 + D*(D/10)**11)) + 1/(1 + D*(D/10)**11)
 VIS=VISP*(1+(MU45-1)*(((1-H)**C-1)/(0.55**C-1))*(D/(D-1.1))**2)*(D/(D-1.1))**2
 RESISTANCE = (L*VIS)/(D**4)
 RETURN
END FUNCTION

为相同输入返回不同值的代码部分是:

RES13 = RESISTANCE(H13, D13, L13, VISP)
RES34A = RESISTANCE(H34A, D34A, L34A, VISP)
RES34B = RESISTANCE(H34B, D34B, L34B, VISP)
RES42 = RESISTANCE(H42, D42, L42, VISP)

PRINT *, D13, D34A, D34B, D42
PRINT *, L13, L34A, L34B, L42
PRINT *, H13, H34A, H34B, H13
PRINT *, RES13, RES34A, RES34B, RES42

此代码的示例输出如下:

   100.00000000000000        100.00000000000000        100.00000000000000        100.00000000000000     
   1000.0000000000000        1000.0000000000000        1000.0000000000000        1000.0000000000000     
  0.10000000149011612       0.10000000149011612       0.10000000149011612       0.10000000149011612     
   1.2387468800341901E-005   1.2387468800341901E-005   1.2387468800341901E-005   1.0223683986767905E-005
   100.00000000000000        100.00000000000000        100.00000000000000        100.00000000000000     
   1000.0000000000000        1000.0000000000000        1000.0000000000000        1000.0000000000000     
  0.10000000149011612       0.10000000149011612       0.10000000149011612       0.10000000149011612     
   1.2387468800341901E-005   1.2387468800341901E-005   1.2387468800341901E-005                       NaN

其中,VISP = 1.0。如您所见,这些值的变化非常规律。我尝试更改 H13、H34A、H34B 和 H42 的值,看看这是否会使代码更加一致,但它仍然会定期返回不同的值。我对这里的所有值都使用双精度。Fortran 90 中是否有一些我没有得到的微妙之处?

标签: fortran

解决方案


推荐阅读