- 締切済み
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
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- ultraCS
- ベストアンサー率44% (3956/8947)
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いらないのかな。
- fibre102
- ベストアンサー率20% (6/29)
F2Cというツールのことだと思います。 #1さんの参考URLをたどればよいと思われます。
- GuruGuru22
- ベストアンサー率51% (177/346)
補足
すみません。f2cの意味がわかりません。具体的に教えてください。