我试图将Fortran 77代码转换为C ++。我通过cygwin使用gfortran编译器。我已经成功转换了大部分代码,但由于它依赖于Random()
,我无法运行此子程序。根据我读的书,子程序是
SUBROUTINE GAUSS(X,SIG)
IMPLICIT REAL*8(A-H)
IMPLICIT REAL*8(O-Z)
INTEGER SUM
SUM=0
DO 14 J=1,6
C THE NEXT STATEMENT PRODUCES A UNIF. DISTRIBUTED NUMBER FROM -32768 TO +32768
IRAN=Random()
SUM=SUM+IRAN
14 CONTINUE
X=SUM/65536
X=1.414*X*SIG
RETURN
END
在代码的顶部,有以下
C THE FIRST THREE STATEMENTS INVOKE THE ABSOFT RANDOM NUMBER GENERATOR ON THE MACINTOSH
GLOBAL DEFINE
INCLUDE 'quickdraw.inc'
END
使用此行
gfortran -std=legacy Listing_4_3.f90 -o test
我收到了这个错误
/tmp/ccQ2l529.o:Listing_4_3.f90:(.text+0x1b): undefined reference to `random_'
collect2: error: ld returned 1 exit status
如何运行此代码?
答案 0 :(得分:1)
忽略这种高斯分布方法非常低效的事实,你可以轻松地生成从-0.5到0.5的数字
call random_number(rran)
rran = rran - 0.5
所以
SUBROUTINE GAUSS(X,SIG)
IMPLICIT REAL*8(A-H)
IMPLICIT REAL*8(O-Z)
REAL*8 SUM, RRAN
INTEGER J
SUM=0
DO J=1,6
CALL RANDOM_NUMBER(RRAN)
RRAN = RRAN - 0.5
SUM=SUM+RRAN
END DO
X = 1.414*SUM*SIG
END
代码仍然包含一些丑陋的东西,但是当你将它转换为另一种语言时......
如果您要在新代码中完全复制此方法存在的问题,可以使用此方法。否则对高斯随机数使用更好的方法,并且不要惊讶它会有所不同,因为这个子程序中的方法不仅效率低,而且不精确。好方法的结果会有所不同。