こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

FortranをCに書き直すにはどうしたらいいでしょうか?

Foratranで書かれている下記のコードをCのコードに置き換えたいのですが、分かりません。
お願いします=(^v^)=

C *---------------------------------------------------------*
C サブルーチンWGEN
C *---------------------------------------------------------*
SUBROUTINE WGEN(EM,R,NN,IR,ACC,ND,DT,AMAX,VMAX,MXCYCL,ERR,UW1,
* UW2)
C
implicit real*8(a-h,o-z)

COMPLEX*16 C(4096)
DIMENSION ACC(ND),UW1(ND),UW2(ND)
DIMENSION E(33),X(33),EE(33)
DIMENSION PDIF(2046),PHI(2049),F(2049),T(2049),SV(2049),H(1),
* RES(2049,1),RR(2049)
PARAMETER (PI2=6.283185)
DATA DX/0.03125/,H0/0./,H/0.05/
C
C

DO 150 K=1,NN2-2
P=RAND2(IR)
C
DO 130 J=2,33
IF(P.LE.EE(J)) GO TO 140
C
130 CONTINUE
C
140 PDIF(K)=-(X(J-1)+(P-EE(J-1))/(EE(J)-EE(J-1))*DX)*PI2
C
150 CONTINUE
C

C *---------------------------------------------------------*
C ファンクションRAND01
C *---------------------------------------------------------*
REAL*8 FUNCTION RAND2(I)
C
INTEGER*4 L,C,T30
REAL MU

PARAMETER(L=843314861,C=453816693,T30=2**30,MU=2.0**31)
C
I=L*I+C
IF(I.LT.0) I=(I+T30)+T30
RAND2=REAL(I)/MU
END
C

投稿日時 - 2005-03-08 17:19:18

QNo.1257831

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

F2Cで変換するのはよいとして、気づいたことを

私も最近はFORTRANを使っていないので、勘違いがあるかもしれないけど。
失礼ですが、このプログラム、コンパイラ通って思ったとおりに動いてますか?

処理系にもよりますが、FORTRANのサブルーチンや関数はオリジナルでは変数はアドレス渡し(ポインタだな)です(値渡しだったら、以下の文は意味がなくなりますので無視してください)。
ですから、RAND2に渡すIは呼ぶたびに値が変わります。150のループでNN2が4以上だと、1回目IR=0で呼んだとしても戻ってくる時、IRは453816693になっています、二回目はこれに843314861を整数演算I=L*I+Cで乗じるのですからオーバーフローしてしまうはずです。

また、精度についてもう少し検討することをお勧めします。RAND2のなかで、単精度の浮動小数点数MUが使われていますが、単精度の浮動小数点の有効桁って一般には仮数部が16進で6桁、10進なら7桁しかありませんから、計算中にLやCの下3桁あたりは信頼できなくなります。

あと、このサブルーチン、RETURNがないんだけど、最近のFortranはRETURNいらないのかな。

投稿日時 - 2005-03-10 15:24:28

ANo.2

F2Cというツールのことだと思います。
#1さんの参考URLをたどればよいと思われます。

投稿日時 - 2005-03-10 00:32:26

ANo.1

f2c

参考URL:http://www.google.com/search?hl=ja&q=f2c&lr=lang_ja

投稿日時 - 2005-03-08 17:29:54

補足

すみません。f2cの意味がわかりません。具体的に教えてください。

投稿日時 - 2005-03-09 09:35:49

あなたにオススメの質問