teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

fortranコードにprint文を二つ追加し、そのあとの実行結果にoutputの内容を書き換えました。

2019/07/08 10:30

投稿

wanwannyaan
wanwannyaan

スコア31

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
- 1581252688.000000
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*)の行がコメントアウトされていて出力例と生合成が取れなかったのでソース当該行の//の位置を変更しました

2019/07/08 10:30

投稿

wanwannyaan
wanwannyaan

スコア31

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
- //printf("b=%lf\na=%lf\n",b,a); (*1*)
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さんの修正依頼に対応しました

2019/07/08 10:21

投稿

wanwannyaan
wanwannyaan

スコア31

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
- 補足:Cプログラムについて、同じ(*1*)出力して、(*2*)の出力が毎回異なります。そのため、fortranまたはfortranC言語の値の受け渡に問題のかな考えています。
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\n a=%lf\n",b,a); (*1*)
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;