質問編集履歴
3
fortranコードにprint文を二つ追加し、そのあとの実行結果にoutputの内容を書き換えました。
title
CHANGED
File without changes
|
body
CHANGED
@@ -9,7 +9,9 @@
|
|
9
9
|
```output
|
10
10
|
b=1.570796
|
11
11
|
a=0.000000
|
12
|
+
1.5707963000000000 0.0000000000000000 4.59149455E-41
|
13
|
+
-469083744 -469083744.00000000
|
12
|
-
|
14
|
+
-469083744.000000
|
13
15
|
```
|
14
16
|
|
15
17
|
```fortran
|
@@ -19,10 +21,12 @@
|
|
19
21
|
INTEGER I
|
20
22
|
DOUBLE PRECISION WIDTH=(X-Y)/10000000
|
21
23
|
DOUBLE PRECISION MENSEKI=0.0
|
24
|
+
PRINT *,X,Y,WIDTH
|
22
25
|
DO I=0,10000000
|
23
26
|
MENSEKI=MENSEKI+DCOS(I*WIDTH+Y)*WIDTH
|
24
27
|
END DO
|
25
28
|
SEKIBUN=MENSEKI
|
29
|
+
PRINT *,MENSEKI,SEKIBUN
|
26
30
|
RETURN
|
27
31
|
END
|
28
32
|
```
|
2
Cコードの(*1*)の行がコメントアウトされていて出力例と生合成が取れなかったのでソース当該行の//の位置を変更しました
title
CHANGED
File without changes
|
body
CHANGED
@@ -36,7 +36,7 @@
|
|
36
36
|
double a,b,menseki;
|
37
37
|
b = atof(argv[1]);
|
38
38
|
a = atof(argv[2]);
|
39
|
-
|
39
|
+
printf("b=%lf\na=%lf\n",b,a); //(*1*)
|
40
40
|
menseki = sekibun_(&b, &a);
|
41
41
|
printf("%lf\n",menseki); //(*2*)
|
42
42
|
return 0;
|
1
otnさんの修正依頼に対応しました
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,11 +1,17 @@
|
|
1
1
|
fortranでcos(x)を**YからXの範囲で台形積分**するプログラムをC言語のプログラムから呼び出すコードを書いています。
|
2
2
|
今回の質問はそのfortranの部分についてで、毎回異なった計算結果が表示されるのですが、fortran初心者すぎて何が理由かわかりません。以下がそのfortranのコードです。また、このコードを呼び出すCプログラムを一番下に置いておきます。
|
3
3
|
|
4
|
-
|
4
|
+
入力はプログラムの実行時にコマンドライン引数で任意の2数を指定して、出力は入力した2数の範囲でcos(x)を台形積分した結果として正しい値が帰ってくることを期待しています。
|
5
|
+
実際に実行したところ、実行する度に違う結果が出ました。(以下は入出力例です。)
|
6
|
+
```input
|
7
|
+
./JikkouFile_Name 1.5707963 0
|
8
|
+
```
|
9
|
+
```output
|
10
|
+
b=1.570796
|
11
|
+
a=0.000000
|
12
|
+
1581252688.000000
|
13
|
+
```
|
5
14
|
|
6
|
-
補足2:fortranにおけるX,Yの値はC言語からb,aを渡しており、そのb,aの値はプログラムの実行時にコマンドライン引数として渡しています。
|
7
|
-
|
8
|
-
追記:毎回(*2*)の出力が異なるのだから、fortranで変数を初期化してないことが原因か?とも思いましたが、私の知りうる範囲では問題なく初期化できているようにも見えてお手上げです。
|
9
15
|
```fortran
|
10
16
|
DOUBLE PRECISION FUNCTION SEKIBUN(X,Y)
|
11
17
|
DOUBLE PRECISION X
|
@@ -30,7 +36,7 @@
|
|
30
36
|
double a,b,menseki;
|
31
37
|
b = atof(argv[1]);
|
32
38
|
a = atof(argv[2]);
|
33
|
-
//printf("b=%lf\
|
39
|
+
//printf("b=%lf\na=%lf\n",b,a); (*1*)
|
34
40
|
menseki = sekibun_(&b, &a);
|
35
41
|
printf("%lf\n",menseki); //(*2*)
|
36
42
|
return 0;
|