• ベストアンサー

繰り返し計算中に定数が変わってしまいます

現在FORTRAN77を用いて繰り返し計算を行っています. ところが計算を繰り返しているうちに一定の値として与えているはずのものが勝手に別の値になってしまいます. 具体的に例をあげますと, a=1.00000 だったものがいきなり a=1.7532423E-16 とかになります. このaの値は繰り返しの度に何かから読み込んでいるものではなく,計算の最初に与えてしまい,最後まで変化しないはずのものです. ですので原因がわからず困っています. 何か原因がわかる方がいらっしゃいましたらアドバイスお願いいたします.

質問者が選んだベストアンサー

  • ベストアンサー
  • nineexit
  • ベストアンサー率100% (8/8)
回答No.4

ソースコードがないので、考えられる可能性を2つほどあげておきます。 1.サブルーチン内でaがローカル変数になっている。 サブルーチンにメインプログラムや外のサブルーチンからaという変数の値を持ってくる場合は、aを引数にするか、グローバル変数として扱うかどちらかが必要です。 それをしていなければ、aの値はそのサブルーチンローカルの変数となってしまいます 引数やグローバル変数(common,include,moduleなど)をチェックしてみてください。 2.配列外の参照になっている real b(2),a という変数を使っている場合に i=3 b(i)=10. とすると、b(3)は存在しないため、配列外参照になります。 配列外参照をすると、他の変数にアクセスすることになります。 例えば、配列外参照で上記のような代入演算を行うと、他の変数が書き代わってしまいます。 特にfortranの場合、subroutineの引数を誤ると配列外参照が起きやすいです。 subroutineの順序や配列の数が適当かチェックしてみてください。 まずは、 gdbを使うか、あるいは、 write(*,*) a をたくさん書いてどこでaの値が変わっているかチェックしてみてください。 なお、コンパイラによっては配列外参照を禁止するオプションが付いています。 例えば、gfortranの場合-fbounds-checkオプションがあります。

hnakata
質問者

お礼

ご回答ありがとうございます。 どうやら配列外を参照してしまっているようです。 実行時のエラーとして「配列をオーバーしてる」という内容のエラーでます。 配列外参照で全ての値がかわってしまうのですね。知りませんでした。 ありがとうございます、勉強になります。

その他の回答 (3)

  • notnot
  • ベストアンサー率47% (4846/10257)
回答No.3

プログラムは、思った通りじゃなくて書かれたとおりに実行されます。 変数の値が変わったのなら、書き換えるようなプログラムを書いてしまっているということです。 ここにプログラムを書くか、あるいは自分で調べるなら、見直してもわからないのであれば、ひたすら write(*,*) a を入れまくって、どこで値が変わったのか調べる。

  • equinox2
  • ベストアンサー率48% (321/660)
回答No.2

考えられる原因は (1)コードの実行中に'a'の値が、あなたにとって意図しない動き(ソースにとっては指示通り)  で書き換えられる。 (2)コンパイラのバグ 一般的には(1)のほうがはるかに可能性が高いので、誰が見てもソースに問題がなければ、  (2)を疑いましょう。

noname#77845
noname#77845
回答No.1

これだけで、原因を探れと…。 そりゃ、無理でしょ。 せめて、その部分だけでもソースを示してもらわないとね。 神様や超能力者じゃないんだから。

関連するQ&A

  • 計算精度(限りなくゼロに近く)

    現在、fortranで大きな数値計算をしています。 そこで、計算回数が多く、その計算過程において大きい値と小さい値とを何回も計算していると誤差が次第に大きくなっていきます。 A=BとなるようにA(又はB)を求めるときの判別としてabs(A-B)<10**(x) としています。 このxに-300ぐらいの値をいれ判別したいのですがそれは可能ですか? もちろん計算には倍精度を使っていますがabs(A-B)が10**(-17)付近になると値が一定になってしまいます。これがfortranの限界なのでしょうか?

  • 根号の中が負の時の計算機での正負判断は?

    コンピュータで数値計算(言語はFortranやC)をする時、次のような場合はどう扱われるのでしょうか。 例1.sqrt(-4)の解は±2iの二つあるが、コンピュータではどうなる? 例2.a>b>0の時、sqrt(b-a)の解の正負符号はどうなる。 最初の値の符号に合わせられると聞いたことがあるが、本当ですか。もしそうならsqrt(b-a)=+・・・ 、sqrt(-a+b)=-・・・ となるのでしょうか。

  • エクセルの計算式で・・

    エクセルの計算式を=1.01*(A1)とし、1行のセルはこの計算式で求められているのですが、この計算結果の値を、小数点以下四捨五入するには、どのような数式にすると良いのでしょうか? 例)A1 500 B1 505 C1 510.05 D1 515.15 E1 520.30 F1 525.50 ...

  • パラメータの値を計算で出したい

    今、fortranを使って以下のようなプログラムを書いています。 1時間毎の温度(t)のデータがあり、それに対して指数関数でRが変化します。 R=a*exp(0.7*t) これに対して、1ヶ月間のRの積算値を測定値として持っています。 この測定値に最も近くなるように定数aの値を求めたいのですが fortranでどのようにプログラムしたらいいのかわかりません。 よろしくお願いします!

  • エクセルの計算式について

    エクセルの計算式について教えて下さい。以下の表があります。 a列とb列は日ごとに変化します。c列は、a/bで計算されます。d列は、bx10をaから引いた値です。e列は前日のeと当日のeの差を表示しています。 x1列は、e列が10以上ならばSを表示する条件式で値を出しています。x2列は、0以下ならばBを表示する条件式で値を出しています。 h列の計算は、x1とx2でBが表示された場合、例えばa列の1/12の18620から1/11の18830を引く計算をし、b列の1/11の1682から1654を引く計算をして、それぞれの解を足します。 また、同様にx1とx2でSが表示された場合には、下記の表のa列1/12の18620から1/21の18760を引き、b列の1/21の1618から1654を引き、それぞれの解を足します。 上記に説明した、それぞれの計算式を教えて下さい。 また、x1とx2は、それぞれaやbの値から導き出される式で日々表示が変わります。ただ、以下の表のようにx1列のように、Sの表示が連続して表示されます。これを、1度Sが表示されると、次の行からはSが表示されないようにする計算式を教えて下さい。 すみません、よろしくご教示下さい。 date      a      b      c  d e x1 x2  h 2000/1/11 18830 1682.0 11.20 2010 -190 B   2000/1/12 18620 1654.0 11.26 2080 70 S 70,000 2000/1/13 18920 1673.0 11.31 2190 110 S 2000/1/14 18850 1654.0 11.40 2310 120 S 2000/1/17 19300 1680.0 11.49 2500 190 S 2000/1/18 19150 1662.0 11.52 2530 30 2000/1/19 18930 1634.0 11.59 2590 60 2000/1/20 19060 1640.0 11.62 2660 70 S 2000/1/21 18760 1618.0 11.59 2580 -80 B -220,000

  • VBAの定数の使い方で、計算値を定数に入れることは可能ですか。

    VBAの定数の使い方で、計算値を定数に入れることは可能ですか。 例えば、モジュール先頭に、 Option Explicit Const TEISU_COUNT As Integer = Application.WorksheetFunction.CountA(Range("A1:IV1")) と書き、その下に、 Sub TestTeisu()   MsgBox TEISU_COUNT   '↑定数式が必要です、のようなエラーが出ます。なぜでしょう?   'エラー時、「.CountA」にスポットがあたります。   'つまり、ここがダメということでしょうか?やはり、この点が動的だからでしょうか? End Sub と書いて、実行。 結果は、上述の通り、エラーとなります。 やはり、定数値には、固定的な数値(上記例では、Integer)や文字列を入れるべきなのでしょうか。 定数に入れることのできる値の注意事項について、 どなたかアドバイスして頂けますでしょうか。 宜しくお願い致します。

  • ∞のΣ計算∫計算の方法

    ∞のΣ計算∫計算の方法が分かりません。 具体的な例として Σ(x*a^x/x !) ←(Σはx=1から∞の範囲) と ∫{x*e^(-ax)}dx ←(∫はx=0から∞の範囲) です。 実際にx=1とかを順に入れていったり、式の変形をして何か糸口を掴めないか、試行錯誤しましたが分かりませんでした。 現段階はうまくいく様な変形の仕方からして既に分からない状態です。 それを含めた解法の道筋を上の2つを例にして教えてください。 宜しくお願いします。

  • 平衡の式の係数と平衡定数Kの求め方

    気体Aと気体Bの混合物を1.0Lの容器にて、一定温度に保ちながら反応させたところ、画像の曲線で示されるような変化をして気体Cが生成し、平衡状態に達した。 (1)この反応aA+bB⇄cCにおける係数a、b、cの値をそれぞれ求めてください。 (2)この反応の平衡定数Kの値を求めてください。 (3)上記の正反対のエンタルピー変化△Hは負の値を持つとする。平衡状態にある反応容器の温度を低下させたとき、化合物Cの温度はどのようになりますか。増加する、減少する、変化しない、のいずれかで答えてください。 途中の計算の過程や解説もできるだけ詳しくお願いします 。

  • 楕円積分のプログラミング

    楕円積分を数値計算で求めようとしています。 Fortranを使っているのですが、まずニューメリカルレシピinCをFortranに直して実行しました。 きちんと翻訳して直したはずなので、それなりの値が出るのですが、どうも誤差が大きいようです。 それはMathematicaでの組み込み関数による計算と比較したことによります。どちらがより近いのかはわからないのですが・・・。(Mathematicaでの計算は正しい(かなり近い)値を返してくれているのでしょうか?どなたか知っておられたらそちらも教えていただけるとありがたいです。どの程度信用できるのか。。。) どちらにせよ、いいプログラムはないでしょうか? ちょっと難しいかもしれませんが、よろしくお願いします。

  • エクセルが再計算してくれない

    よろしくお願いします。 エクセルで困っていることがあります。 別シートのセルに入力した数字が入るように設定されているはずなのですが、その数字が入ってきません。 (例えば、今現在「1」と入っているものに「2」と入力しても「1」のままになっています。) そのセルをダブルクリックしてEnterを押すと最新の状態(例で言うと「2」)に更新されます。 オプションの計算方法は自動(A)になっています。 F9を押しても変化はありません。 (正確に言うと何回か押していたら、一度だけF9で再計算してくれましたが、 その後、何回押しても再計算してくれなくなってしまいました) 元々私が作ったデータではなく、私もあまり詳しくないのでわかりませんが、 マクロを使っているようです。 それが原因なのかわかりませんが・・・ 一括で計算してくれるなら、手動でもかまわないのですが、何か方法はないでしょうか? *パソコン初心者なのでよくわからない箇所等ありましたら、 補足しますのでよろしくお願いします。

専門家に質問してみよう