gpt4 book ai didi

function - Fortran函数返回意外的类型和值

转载 作者:行者123 更新时间:2023-12-04 13:14:09 24 4
gpt4 key购买 nike

我正在一个需要在Fortran中实现少量数值方法的项目。为此,我需要编写一些递归函数。这是我的代码。

!     
! File: main.F95
!

RECURSIVE FUNCTION integrate(n) RESULT(rv)
IMPLICIT NONE
DOUBLE PRECISION :: rv
INTEGER, INTENT(IN) :: n
DOUBLE PRECISION, PARAMETER :: minusone = -1.0
IF (n == 1) THEN
rv = 10 !exp(minusone)
RETURN
ELSE
rv = 1 - (n * integrate(n - 1))
RETURN
END IF
END FUNCTION integrate

RECURSIVE FUNCTION factorial(n) RESULT(res)
INTEGER res, n
IF (n .EQ. 0) THEN
res = 1
ELSE
res = n * factorial(n - 1)
END IF
END

PROGRAM main
DOUBLE PRECISION :: rv1
PRINT *, factorial(5)
PRINT *, integrate(2)

!READ *, rv1

END PROGRAM main

对于此程序,输出为:
         NaN
1

如果更改打印语句的顺序(第30和31行),输出将是:
         1
-19.000000

输出应为(对于原始打印对帐单顺序):
  120  
-19

我从Wikipedia Fortran 95 language features页面上提取了阶乘函数。
  • 编译器:带Cygwin的gfortran 4.5.3
  • IDE:Netbeans 7.0.1
  • 平台:Windows 7
  • 最佳答案

    您的函数编写正确。问题出在主程序中,在该程序中您未显式声明integratefactorial函数的类型,因此您具有隐式类型,在这种情况下,假定factorial假定为REAL,而integrate假定为INTEGER。由于某种原因,您的编译器没有警告您有关类型不匹配的信息。我的做了:

    $ gfortran recurs.f90 
    recurs.f90:26.22:

    PRINT *, integrate(2)
    1
    Error: Return type mismatch of function 'integrate' at (1) (INTEGER(4)/REAL(8))
    recurs.f90:27.22:

    PRINT *, factorial(5)
    1
    Error: Return type mismatch of function 'factorial' at (1) (REAL(4)/INTEGER(4))

    您应该将主程序更改为:
    PROGRAM main
    IMPLICIT NONE
    DOUBLE PRECISION, EXTERNAL :: integrate
    INTEGER, EXTERNAL :: factorial
    PRINT *, factorial(5)
    PRINT *, integrate(2)
    END PROGRAM main

    注意 IMPLICIT NONE行。此声明语句将禁用任何隐式类型,并且如果未明确声明所有变量和函数,则编译器将引发错误。这是每个Fortran程序中非常重要的一行,如果有的话,您会自己解决问题,因为这将迫使您在程序中显式声明所有内容。

    现在的输出是:
             120
    -19.0000000000000

    如预期的那样。

    附带说明一下, DOUBLE PRECISION类型声明的灵活性不如使用指定了 REAL参数的 KIND灵活,例如一个 REAL(KIND=myRealKind)。查看有关如何正确使用 KIND的问题的答案: Fortran 90 kind parameter

    关于function - Fortran函数返回意外的类型和值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11816351/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com