![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
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
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.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いらないのかな。
No.1
- 回答日時:
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ExcelVBAでDo Until loopのネスト、IF文を使って一致する物と一致しない物としたい 11 2022/12/24 17:46
- Visual Basic(VBA) VBAプログラミング 2 2022/11/27 12:07
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Visual Basic(VBA) ExcelVBAの転記について 1 2022/03/23 20:13
- その他(プログラミング・Web制作) FORTRAN77の配列(除算) 2 2023/02/01 14:34
- Visual Basic(VBA) コード名シートA列と集計シートA列のコードが一致したら、コード名シートA5からk12の範囲をコピーし 1 2022/08/29 23:46
- Visual Basic(VBA) VBAプログラミング 2 2022/11/27 12:13
- Visual Basic(VBA) 数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct 3 2022/12/04 00:00
- Visual Basic(VBA) マクロ実行時、自動で背景色を変えたい。 C列にあるチェックボックスをチェックするとB列に「TRUE」 4 2022/11/08 11:14
- Excel(エクセル) ExcelのVBAコードについて教えてください。 1 2022/06/20 09:22
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
例外処理のフローチャートの記...
-
サブルーチンを認識しません。
-
モジュールとサブルーチン
-
ExcelVBA AddinでOnAction
-
Excel VBAで、ユーザーフォー...
-
”:”がいっぱいの文について。
-
ACCESSのVBAでPrivate Sub ~en...
-
FortranをCに書き直すにはどう...
-
Excel VBAでリンク切れをチェッ...
-
Excel VBA 『Call』で呼び出す...
-
ユーザー定義関数に#NAME?が返...
-
VBAでoutlook365が起動しません。
-
VBAで別モジュールへの変数の受...
-
モジュールの最大数はいくつな...
-
ユーザーフォームに最小化・最...
-
VBでグローバル変数を宣言するには
-
'Range'メソッドは失敗しました
-
Excel VBAで、ユーザーフォーム...
-
エクセルVBAでシートモジュール...
-
Excelシート内セル記述の違いに...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
例外処理のフローチャートの記...
-
Excel VBAで、ユーザーフォー...
-
モジュールとサブルーチン
-
”:”がいっぱいの文について。
-
オフコン(富士通Kシリーズ)...
-
ExcelVBA AddinでOnAction
-
ACCESSのVBAでPrivate Sub ~en...
-
Attempt to free unreferenced ...
-
VBAで2重のDoLoop関数から抜け...
-
COBOLで、Shellを起動するには?
-
GOSUB命令とは
-
サブルーチンを認識しません。
-
同じコンボボックス、リストボ...
-
Perlのスレッド?
-
サブルーチンを外部ファイルで...
-
配列と互換性のない型の要素に...
-
サブルーチンの中にサブルーチ...
-
初心者です。Perlではどんな時...
-
プログラミング Fortran
-
サブルーチンを使った再帰的な...
おすすめ情報