fortranで変数の値が正確に代入されない現象について

このQ&Aのポイント
  • fortranで変数の値が正確に代入されない現象についての質問です。プログラムでは倍精度で変数を宣言し、定数も倍精度で代入しているにもかかわらず、値が正確に代入されない問題が発生しています。なぜこのような現象が起きるのか、ご存知の方がいらっしゃいましたら教えてください。
  • fortranで変数の値が正確に代入されない問題が発生しています。プログラムでは変数の型を倍精度で宣言し、定数も倍精度で代入しています。しかし、代入される値が正確に表現されず、値がずれてしまう現象が発生しています。この問題の原因や解決策を知っている方がいらっしゃいましたら、教えていただければと思います。
  • fortranのプログラムで変数の値が正確に代入されない問題が発生しています。変数の型は倍精度で宣言し、定数も倍精度で代入されているにもかかわらず、値が正確に代入されずにずれてしまう現象が発生しています。この問題について理解がある方がいらっしゃいましたら、解決策や原因について教えていただけると助かります。
回答を見る
  • ベストアンサー

fortranでx=1としても0.9..が入る

fortranで以下のようなプログラムにてxに1.0^-6を代入し、 その中身を表示しました。 --------------------------------- program test real(8) :: x = 1.0d-6 write(*,*) x write(*,*) x * 1.0d6 write(*,*) int(x * 1.0d6) end program test --------------------------------- しかし、結果は以下のようになり、 0.999999999999999955^-6となってしまいます。 さらに、やっかいなことに10^6倍して 整数型に変換しても0と認識されてしまうのです。 ---------------------------------- $ ./a.exe 9.99999999999999955E-007 1.00000000000000000 0 ---------------------------------- 変数の型も倍精度で宣言し、定数も倍精度(d付き)で 代入しているはずなのですが、なぜこのような現象が 起きるのでしょうか。 ご存知の方いましたら教えて頂けると助かります。 なお、コンパイルはgfortranで行っています。

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

  • ベストアンサー
noname#161640
noname#161640
回答No.2

fortranは使ったことがないのですが、これはプログラミング言語全般で一般的に見られる現象と思います。すなわち、小数の値に誤差が出る原因はなにか?ということですね。 小数は、コンピュータでは完全に正しく表現できません。誰でも思いつくのが循環小数の存在です。例えば、10 / 3は、0.33333……ですが、コンピュータでは適当な桁で終わってしまいます。0.33333という具合ですね。これに3をかけると0.99999で、1には戻りません(まぁ、最近の言語では循環小数を認識しちゃんと1に戻るものもありますが、考え方として、ということです)。この問題は、誰でも理解できることと思います。 この問題が、2進数でも起こります。すべての数値は、コンピュータ内部では2進数として処理されています。やっかいなのは、2進数と10進数では微妙にその性質が異なる点です。2進数では、1を10のn乗で割った値は循環小数になるのです。1 / 10は10進数では0.1で割り切れますが、2進数では循環小数になり割りきれません。先の10 / 3と同様、適当なところで切り捨てられ、不正確な値として保管されます。このため、1 / 10の値に10をかけても0.99999……となり、1には戻らないのです。 この現象が、ご質問のケースでも内部で起こっているのだと思います。

goota10
質問者

お礼

な、なるほど!! そういうことだったのですね! 非常に的確で丁寧なご説明ありがとうございます。 とてもすっきりしましたm(_ _)m いやー、こんなに即答して頂けるとは、・・・すごいですね!!

その他の回答 (1)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

どんな精度を使おうとも、有限の桁で処理している限り、10進数⇔2進数の変換の際に誤差が生じます。 http://ja.wikipedia.org/wiki/%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0 の「精度」のところに簡単に書いてあります。 「浮動小数点 誤差」「浮動小数点 精度」といったキーワードで検索するとたくさん解説がみつかります。

goota10
質問者

お礼

ご回答ありがとうございます。 そうだったんですね、勉強不足でした。 本当にありがとうございましたm(_ _)m

関連するQ&A

  • Macでfortran

    Mac(Mac OS X Lion 10.7.4)でFortranをコンパイルしたいのですが、なかなかできません。 まずXcode 4.3をインストールしました。 gfortran4.6もインストールしました。 ターミナルで「gfortran」を打つと、 gfortran: 致命的エラー: 入力ファイルがありません と返ってきます。 そこで「gfortran test1.f」とソースコードtest1.fをコンパイルしようとすると、 gfortran: error trying to exec 'as': execvp: No such file or directory と出てきて、コンパイルできません。 何が問題で、どのようにしたらコンパイルできるようになるのでしょうか。

  • Fortranについて教えてください

    Fortran90で書かれた、又はこれから書く、プログラム実行したく GCCのgfortranをインストールしました。OSは、Windows XPです。 ところが、コンパイルのところで、つまずいてなかなか進みません。 (gfortranは動いてますので、インストールに問題はないと思います。) そこで、gfortranについて(オプション等)、解説しているサイトや文献を教えて頂きたいと思います。 英語力があまり無いので、日本語のものを紹介いただけると助かります。 また、十数年ぶりのフォートランですので(現在はVBAしか触っていません)、初学者向けだと、なお助かります。 どうか、よろしくお願いします。

  • Fortran90/Fortran95→Fortran77

    大学の授業でFortranを使ったプログラミングを勉強しています。 以下の文が大学のPCに入っているコンパイラでは問題なくコンパイルでき実行できるのですが、家のPCだとコンパイルすることが出来ません(以下の文でエラーが出ます) 大学のPCの開発環境はFujitsu-FORTRANだと思います(^ ^; 家のPCはSalford FTN77 Personal Edition CompilerとCPad for Salford FTN77を組み合わせて使用しています なぜエラーがでるのか自分なりに考えた結果、Fortran90/Fortran95のプログラムをFortran77のコンパイラでコンパイルしているからだと思います(全くの勘違いだったら指摘して下さい) Fortran90/Fortran95の開発環境がフリーで整えばいいのですが、見つからないのでプログラムを修正したいと思います そこで、力を貸していただきたいのです 前置きが長くなりましたが、エラーが出る文は以下のところです open(8,file='freq_ex13.dat',action='write',status='replace') ここを、Fortran77のコンパイラでコンパイルできるようにアドバイスを下さい よろしくお願いします

  • Fortranの倍精度実数について

    こんにちは。 現在、Fortran 90でプログラムを作成しています。 その中で、整数の倍精度実数への型変換についての疑問がわきましたので、質問させていただきます。 以下の2つのプログラムで、計算がより速く、より精度よくできるのはAとBどちらなのでしょうか。 実際は下記のプログラムが、ループの中に入っているので少しでも計算時間を短くしたいのです。 よろしくお願いいたします。 program A(毎回dxを足す) ----------------------------- real(8) :: pi, dx real(8), dimension(1000) :: x integer i, j pi=atan(1d0)*4d0 dx=pi/5000d0 x=0d0 j=1 do i=1, 1000 x(i)=x(j)+dx j=i write(*,*)x(i) end do ----------------------------- program B(毎回dx*ループ回数を計算する) ----------------------------- real(8) :: pi, dx real(8), dimension(1000) :: x integer i, j pi=atan(1d0)*4d0 dx=pi/5000d0 x=0d0 do i=1, 1000 x(i)=dx*dble(i) write(*,*)x(i) end do -----------------------------

  • 数値計算で生じる小さなごみ

    ある問題を数値的に解こうと思いFortranでプログラムを組んでいるのですが、倍精度の数値計算で以下のような事が起きて困っています。 プログラムの中で A=B-C*D (変数は全て倍精度実数変数) のような代入文があるのですが、 write(*,*) B,C,D とすると、0.250000000000000 0.500000000000000 0.500000000000000 と表示されるのですが、 write(*,*) B-C*D や write(*,*)A では-1.79570984817912D-017 などと表示されます。(この数値に意味はないのでしょうが、同じシチュエーションでは常に同じ値が表示されます) 入力した値の精度外の「誤差」ですが、どこに原因のある問題でしょうか? 因に使っているコンパイラはintelのサイトで入手したフリーの評価版ifc ver.6 でそれにpentium4に最適化するオプションをつけてコンパイルしています

  • Fortran : 複数の.fファイルのコンパイル

    先輩からあるシミュレーションコードをもらったので、Cygwin上でコンパイラにgfortranを用いてプログラムを回したいのですが、複数の.fファイルと.hファイルが有りどうすればコンパイルできるのか解りません。gfortran ???←ここのコマンドがわかりません。 全くのド素人だと思ってください。 先輩にはVisual Fortranを用いているので解らないと言われてしまいました。 どなたかアドバイスお願いします。

  • fortran プログラミング

    ifortでは問題なくコンパイルできたプログラムを、gfortranで コンパイルしたところ、次のようなエラーが出ました。 DATA ENDWRD /' $END '/ 1 Error: Incompatible types in assignment at (1), CHARACTER(1) to REAL(8) Eが頭文字の変数をdouble precisionにするようにしてあるので、 多分double precisionにcharacterを代入しようとしているのが gfortranでは駄目なんだろうと思いますが、これを解消する方法 があれば教えていただけると助かります。よろしくお願いします。

  • Fortranについて質問です!

    Fortranで扱う倍精度実数で「1.0D60」は、1.0×10^60という解釈でいいのですか? 本当始めたばっかりで理解が浅いので…どなたかよろしくお願いします><

  • Fortran "実引数の型が仮引数の型と異なります。"

    Fortran "実引数の型が仮引数の型と異なります。" Intel Visual Fortranの最新版をMS Visual Studio 2008で使用(お試し)しています。 既存のFortranプログラムでエラーが出て、使えなくなりました。 問題点を要約すると以下のようなシンプルなコードに集約されました。 ---------------------- 00 program main 01 call sub1(10.d0) 02 call sub1(10.0) 03 end ! ---------------------- 04 subroutine sub1(rr) 05 real*8 rr 06 write(*,*) 'rr = ', rr 07 end subroutine ! --------------------- 昔のFortranでは、Subをcallする時に、仮引数の型と厳密に一致していなくても、うまく処理してくれたと思います。(倍精度でも整数でも、同じ数値とみなして) オプションのルーチンインターフェースのチェック(/warn:interfaces)をオフにすると、コンパイルは出来るようになるのですが、上記プログラムの計算結果は、01行と02行で結果が異なってきます。 (02行はおかしな値が入る) 本来、ランタイムエラー防止の観点からは、このような厳密性を要求するのは良いことだと思いますが、既存のプログラムが実行できなくなるのは痛手なので、何かオプションの変更で対応出来ないものでしょうか? よろしくお願いいたします。

  • fortran77教えてください

    fortran77の問題で次のプログラムの作成の仕方を教えてください 整数A,B,Cを読み込み、それを係数とする2次方程式Ax^2+Bx+C=0の解を計算して表示するプログラムを サブルーチン副プログラムを用いて作成せよ(複素数型を使うこと) メインプログラムでは整数A,B,Cの入力および解の出力および解の出力を行い解の計算はサブルーチン副プログラムで行うこと なお'keisan.txt'という名前のデータファイルに結果を出力するように 計算時は以下の3つの方程式を用いること x^2+3x+5=0 X^2+6x+4=0 x^2+x+1=0

専門家に質問してみよう