• ベストアンサー

Fortranの変数

Fortranの変数の取り扱いに関する質問です。 実数で宣言した変数に 33.3 という数字を読み込ませたのですが, そのまま書式を指定せずに書き込ませると 33.2999992 と表示されました。 これはなぜなのでしょうか。

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

今日のコンピュータでは、一般に2を基数とした指数表記によって小数を表します。 指数表記というのは 2.9995 × 10^6 のような表記方法です。 この例は基数が10ですが、コンピュータは2を基数としてこれを行います。 ここで、十進数の33.3 を二進数に変換しようとすると、有限桁では表すことができません(実際にやってみてください)。 そこで精度に従って切捨てが行われます。 こうして情報が落ちてしまったものを再度変換するときに、書式指定しなかったときには 限界ぎりぎりまで変換しようとしたので 32.999... のような出力になったのです。

参考URL:
http://ja.wikipedia.org/wiki/%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0
fumham
質問者

お礼

なるほど!すごくよく解かりました! 本当にありがとうございました!

その他の回答 (1)

  • baber
  • ベストアンサー率18% (17/92)
回答No.1

コンピュータ内で実数は浮動小数点表記で現されます。 ですので、33.3は浮動小数点ではきっちりわりきれないため、33.299....のように内部的にはもつことになります。 これは、別にFORTRANに限った話ではなくコンピュータ全てに言えることです。 で、実数の有効桁数は6~7桁なので、その桁内でフォーマットして表示してやれば33.3になるはずです。 これは、電卓で、10÷3×3が10にならないのと似たような話です。

fumham
質問者

お礼

大変よくわかりました。 ありがとうございました!

関連するQ&A

  • C言語での変数の書式設定

    こんばんは。 このたびC言語を学びはじめたのですが、変数の書式設定の部分で分からない部分があったので、質問させていただきました。 分からない部分というのは%ld,%hd,(%lf)(%hf)です。(()内に書いたのは存在するか分かりませんが・・・。) これらはshortやlongで整数(実数)を表現する書式だと書いてあったのですが、具体的に何がどう違うのかがよくわかりません。 ためしにlong型で宣言した変数を%hdで表示してみたらshort型で表現できる数のみしか正常に表示されませんでした。しかし、short型で宣言した変数を%ldで表示してみても何も変化が見られません。また、実数に関してはよくわからない値が返ってきてしまいました。 変数で宣言した型と実際に使う書式が合致するか否かでは一体何がどう変化するのでしょうか? 初歩的なことかもしれませんが、以上の疑問の答えを知っていらっしゃる方がいましたら、どうかご教授ください。お願いいたします。

  • FORTRAN90での大域変数

    FORTRAN90で大域変数を使いたいのですが、どのようにすればいいのかが分かりません。 検索かけてみたりもしたのですが見つからず、FORTRAN90には用意されていないのかと思い質問いたしました。 よろしくお願いいたします。

  • Visual C++とVisual Fortranの変数を共用したい

    FORTRANで作成したサブルーチンを活用し、C++からコールする形でコードを再利用しようと考えています。 C++からFORTRANを呼び出すのはすぐに出来たのですが、データの引渡しで困っています。 FORTRAN側ではグローバルな変数を多数(100個以上)宣言しており、引数としては渡せないのでC++側でも同名の変数を宣言して共用し、データのアクセスをしようと目論んでいます。FORTRAN側のコードは極力触りたくありません。 しかし、FORTRANでexternに相当する宣言の仕方が分からず、うまく同じ領域を共用できるようになっていません。 具体的にどんなことをすれば良いのかご存知の方がいらっしゃいましたら、ぜひご教授願います。 宜しくお願いします。

  • FORTRAN90で書式に変数を使いたい

    FORTRAN90で書式に変数を使いたい 配列aの要素数が3である場合の書き出し方は例えば、  print '(3I5)', a ですよね。 配列aの要素数がnである場合、どう書き出せばよいのでしょうか?  print '(nI5)', a だとエラーが出ます。 繰り返し文を駆使する以外にないのでしょうか?あまり美しくない気がします。

  • Fortran77 (intel fortran)

    Fortran77のプログラムをIntel Fortran (ifort v14.0.1)でコンパイルした時、以下のワーニングがでます。 remark #8291: Recommended relationship between field width 'W' and the number of fractional digits 'D' in this edit descriptor is 'W>=D+7'. 100 FORMAT(12E9.3) --------------------------^ 100の書式はREAL*8で宣言された変数を書き出す時に使っています。 これは具体的にはどういう問題について警告しているのでしょうか? 環境はCentOS6.5 32bitにて実行しています。 よろしくお願いいたします。

  • 正の実数のみで書かれたバイナリーファイルの読み込み

    fortranにてバイナリファイルの読み込みを試みています。 そのファイルは4バイトの正の実数のみで書かれています。 符号がある無しで表示出来る実数の範囲が異なってくると思うのですが、正数値のみを取り扱わせるような変数宣言はfortranでどのようにすればよいのでしょうか? 単純に「real*4 変数名」と宣言すると読み込んだ値が明らかに 異常値を示します、endian処理はきちんとやっているので 符号のある無しが原因だと想定しています。お知恵をかしてください。

  • Fortran において変数の定義

    現在Fortranを使いプログラムをしていますが、円の面積を計算するため変数を定義しているところでおかしな問題が出てきました。円周率を定義するところで自分でつけた変数名 PAI の値が入力データと違うことに気づきました。以下のように簡単なプログラムを作って試したのですが結果は同じくおかしな値が出てきました。 IMPLICIT REAL*8(A-Z) PAI=3.14159265 WRITE(*,1)PAI 1 FORMAT(E30.22) PAUSE END 結果は 0.3141592741012573000000E+01 とディスプレイに表示され、このあとにPAIを使った計算があるならこの値で計算されます。私としては、PAI=3.14159265と出力し、計算もしたいのですが... これは FORTRAN 自体の特有の性質なのでしょうか、それともソフト、ハード的な問題なのでしょうか? 尚、変数 PAI をファイルから読み込んだり、PAI=4.0*ATAN(1.0) (PAI=3.1415926535897930 となりますが)、PAI=3.14159265D+00などにすると正確に表示、計算出来ます。

  • fortranの整数と実数

    fortranに関する質問です. 型宣言を下のように行った上で,計算を行うと dが110ではなく,109と出力されるのですが,なぜでしょうか. dも実数で宣言しておくと110.0000と表示されます. こうなる理由と解決策をぜひお教えください. real a,b,c integer d a=33.0 b=3.0 c=0.1 d = (a/b)/c write(*,*) d

  • FORTRAN90

    fortran90で、ファイル出力をフォーマット付きで行いたいのですが、 write(unit,****) のような文で、****の部分のフォーマット指定を マニュアルで入力するのではなく、その場に応じた形で 指定する方法はありますでしょうか? character変数の文字にフォーマット指定の文字列、例えば六つの実数を横一列に書き出す場合を想定して write(char,"(A,I1,A)")"'(",Int,"D13.5)'" とし、 write(unit,char)x,y,z,w,s,t などとするのはできませんでした。 ここでいうintの部分を自動的に変えれるようにしたいのですが 何か策はありますでしょうか? わかりにくい説明ですみませんが宜しくおねがいします。

  • Fortranのフォーマット

    Fortranのフォーマットで、下記のように表示したい場合どうしたらよいのでしょうか?桁落ちしてもかまいません。 実数型(f)で表示した場合、0.が抜けてしまいます。 指数表示はしません。 0.0001 5.4321 1234.5 よろしくお願いします。

専門家に質問してみよう