• ベストアンサー

FORTRANの問題

今、大学でFORTRANを習っているのですが、先生の出した例題で、  N = 5 A = 1.1 A = A * N WRITE (*,*) N, A この場合、ディスプレー上に表示される変数Nと変数Aの値は各々5と0.0になる、この理由は? というのがありました。しかし、自分で勉強した限りはどうしても変数Nの値は5.5だと思うのですが…でもやり始めたばっかで自信もありません。どなたか教えていただけませんでしょうか?

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

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

もし先生に「正解」を聞けたのならぜひ補足なりしていただきたいのですが、 それともかく、さらに調べたところでは 実数 × 整数 という式が現れたときに、整数のほうを実数に変換して実数同士の式として 計算しなければならない。と決まったのは Fortran 77のときのようです。 それ以前はどうなるかは決まっておらず、コンパイラにより挙動が異なっていた 可能性はあります。 規格書を探してみたのですが、新しい規格(Fortran 90準拠)が決まった時点で 前のものは破棄されるようで、ネット上では見つけられませんでした。 一応まとめると、Fortran 77以降(77, 90, 95, 2000, ..)であってかつ規格をきちんと 守ったものであれば 5.5になるはずである。 77よりも前のもの(66, IV, III ...)については明確な規則は決まっていない。 といったでしょうか。

exodus55
質問者

お礼

ありがとうございます! 明日ちょうど授業があるので先生に聞いてみます。

その他の回答 (4)

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

ちとカンニングしました(笑)が、やはり Aが0.0になるというのがわかりません。 少なくともわたしの試したコンパイラでは 5, 5.5の出力になりましたし、 規格らしきものを探してみましたが(多分77ですよね)が、 整数と実数を混合してひとつの式におくことを制限するような記述は見つかりませんでした。 6 EXPRESSIONS http://www.fortran.com/fortran/F77_std/rjcnf0001-sh-6.html#sh-6.1.4 の Table_2 Type and Interpretation of Result for を見る限りでは自動的に型の変換(昇格)が行われると思えます。 また、私見を申さば暗黙の型宣言による変数の使用は21世紀の今は避けてしかるべき 過去の習慣だろうと思います。 パズルとしての問題ならいいでしょうけど、どういう意図を持って先生が このような問題を出されたのか疑問です。

exodus55
質問者

お礼

ありがとうございます! 僕の持っている教科書にも(整数)×(実数)は自動的に(実数)×(実数)になると書いてあったもので… じゃあ5.5ということでいいんでしょうかねぇ…

回答No.3

どこのメーカーの何という名前のコンパイラを使用していますか? 少なくとも、#2さんの回答にある >型の異なる変数どおしの演算を行うと「偽」となり、ゼロを出力 という話は、整数型と実数型の間では聞いたことがありません。

exodus55
質問者

お礼

ありがとうございます! え…そうなんですか?じゃあ#2の方は… コンパイラとかはよく分からないのですが、FORTRAN77というのを勉強しています。

  • vaio09
  • ベストアンサー率37% (756/2018)
回答No.2

先生の言うとおりです! N=5, A=0.0となります。 FORTRANの文法上の規則(暗黙の型宣言、というのですが)では、 ・A~H, O~Zで始まるものは実数型 ・I,J,K,L,M,Nのいずれかで始まる変数は整数型 です。 なので、型の異なる変数どおしの演算を行うと「偽」となり、ゼロを出力します。 この理屈がわかれば、このソースの演算は、とても簡単です。 A = A * N この部分は、「実数型の変数A」と「整数型の変数」を積算しており、「偽」つまりゼロとなるのです。Aは実数型でしたから、ゼロというのは「0」ではなく「0.0」です。 従って、N=5, A=0.0が正解です。 1学期のこの時期に出す問題としては、小粒でキリリとしていて良い問題ですね。 悩んだ分だけ、ずっと覚えておける良問題ですよ。

exodus55
質問者

お礼

ありがとうございます! そうなんですか…偽となったら0になってしまうんですね。ありがとうございます。 先生はうちの学部の一番偉い人みたいです。やっぱり教師としても優れているんですね!

exodus55
質問者

補足

#3、#4の方の意見を参照する限り、A=5.5みたいなんですが… 先生も忙しい方なので、疲れていて間違ったんだと思います。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

私は、Nは5、Aは5.5だと思います。 掛け算を行なう前は、Nは5、Aは1.1ですよね。 掛け算で、AにNを掛けて、結果を新しいAとしています。 1.1(実数型)と5(整数型)の掛け算は型が異なりますので、 精度のよい方の型(この場合は実数型)に変換し、 結果も精度のよい方の型(実数型)になるはずです。 よって、1.1(実数型)と5.0(実数型)との掛け算を行なった結果の 5.5を実数型のAに代入しますので、Aは5.5になるはずです。 それとも、どこかに深~い落とし穴でも潜んでいるのでしょうか…。

exodus55
質問者

お礼

ありがとうございます! そうですよね…まず0.0なんかどっから出てくるんだよ!って感じです。

関連するQ&A

  • FORTRAN

    FORTRANについて聞かせてください。 WRITE(*,*) 'A= READ( *,*) A Aの値を0~0.15の範囲で0.01刻みで増やしていって実行したいのですが,どのようにプログラムを作成すればいいですか?? DOループだと思うのですが,あってますか? 分かる方いらっしゃったらお願いします。 FORTRANについてお勧めの初心者用ホームページがあればおしえてくださると助かります。

  • Fortran90/95の出力方法について

    Fortran90/95の出力方法について Fortran95において,変数の値をwrite文で出力した後に改行しない方法を教えてください. 具体的には次のProgram reiを用いて質問します. program rei implicit none integer i, n read(*,*) n do i = 1, n write(*,*) i end do end このプログラムを実行させnに3を代入すると次のように表示されます. 1 2 3 しかし,私としては次のように改行せずに表示させたいのです. 1 2 3 また,諸事情により配列は使用しません. プログラムをどのように改良すればよいのでしょうか.教えてください.

  • 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などにすると正確に表示、計算出来ます。

  • 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のコンパイラでコンパイルできるようにアドバイスを下さい よろしくお願いします

  • FORTRAN77でプログラミング

    今年、大学の授業でFORTRAN77を使ったプログラミングを勉強することになりました。 今で3回授業が終わったところなのですが、いきなりつまずいてしまい皆さんの知恵をお借りしたいと思います。。 作るプログラムは 問:摂氏(C)、華氏(F)、絶対温度(K)のいずれかの値を { xx(温度の数値),yy(CかFかK) }のように入力したときに、入力した値以外の単位での温度値が表示されるプログラムを作れ。 自分なりに作ってみたのが下のプログラムです。 全く論外なプログラミングをしているかもしれませんが…。 (自作) c234567 implicit none real n,cx,fx,kx character*1 d,c,f,k c n:入力値 d:入力された温度の値 C:摂氏 F:華氏 K:絶対温度 write(*,*) '温度値、単位を表す文字を入力してください。' read(*,*)n,d if(d.eq.c)then cx=n fx=cx*(9/5)+32 kx=cx+273.15 else if(d.eq.f)then fx=n cx=(fx-32)*(5/9) kx=cx+273.15 else kx=n cx=kx-273.15 fx=cx*(9/5)+32 end if end if write(*,50) cx,'C',fx,'F',kx,'K' 50 format(' ',f7.3,a3,f7.3,a3,f7.3,a3) stop end これをどうしたらいいのでしょうか。 ちなみに、使用しているFORTRAN77は Compaq Visual Fortran Optimizing Compiler Version 6.1 です。 どうぞよろしくお願いします。

  • fortran 初心者です。

    fortranでフィボナッチ数列 A0 = 0 , A1 = 1 , Ai+1 = Ai + Ai-1 (i =2,3...) を計算するプログラムを作っています。 得られた値が奇数の時には、数値の右横に*をつけ、奇数かつ3の倍数なら**をつけます。 が、以下のようにプログラムしましたが、*印がつきません。どこが、間違っているのか、アドバイスよろしくお願いします。 C Question A0 = 0.0 A1 = 1.0 A2 = 1.0 WRITE(6,*)'A0 = 0.0' WRITE(6,*)'A1 = 1.0' DO 10 I = 2,10,1 A2 = A1 + A0 N = A2-(A2/2)*2 M = A2-(A2/3)*3 IF ( M .NE. 0 .AND. N .NE.0) THEN WRITE(6,*)'A',I,'=' ,A2,'*' ELSE IF ( M .NE. 0.AND. N .EQ.0)THEN WRITE(6,*)'A',I,'=' ,A2,'**' ELSE WRITE(6,*) 'A',I,'=' ,A2 END IF A0 = A1 A1 = A2 10 CONTINUE STOP END

  • Fortranコードの疑問

    FORTRANのコードに関して教えてください。 いま作っているプログラムを走らせるとCommand terminated abnormally.と言われて途中で止まってしまいます。これは小さな計算(2000格子点)くらいだと上手くいくのですが、16000格子点くらいになるとダメです。これくらいだとメモリ的にもまだまだ余裕があるので、色々と他の理由を探してみましたが万策尽きました・・・ どうやら write(*,*)n…繰り返し数 n=2000 write(*,*)n do i=1,n -- code ----- enddo としたとき、出力は普通、 0 2000 となってDo文を実行すると思うのですが、上記の場合のように大きな(?)計算をさせようとすると、 1081265151 2000 などと、定義してもいないのにとんでもない値がnに代入されてしまうようです。何故このような現象が起こるのかご存知の方がいらっしゃいましたら、どうかご教示頂けると幸いです。

  • 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のプログラムで write(IUO,1) a(10) write(IUO,1) b(10) write(IUO,1) c(10) 1 format(1p,1f10.4) と書かれていると、ファイルIUO内に、 formatから1行でa(10),b(10),c(10)の値が連続して出力されます。 a(1) b(1) c(1) a(2) b(2) c(2) ........ ........ ........ a(10) b(10) c(10) のようにa,b,cの値を各列ごとに出力させたい時はformatをどのように書けばよいのでしょうか? 詳しい方がいらっしゃったら教えて下さい。 よろしくお願いします。

  • fortran 配列

    はじめまして。fortranを勉強しているのですが割付け配列がよく理解できないので教えていただきたいのですが。以下に自分で作った簡単なプログラムを実行していたのですが正しい値になりません。どこが間違っているのでしょうか?教えて下さい。よろしくお願いします。 program list2_3 implicit none real(8), allocatable :: u(:), v(:) integer :: i, n = 2 real(8) dotp allocate (u(n), v(n)) u(1:2) = (/1.2d0,3.4d0/) v(1:2) = (/4.1d0,2.6d0/) dotp = 0.0d0 do i = 1, n dotp = dotp + u(n) * v(n) enddo deallocate (u, v) write(*,*) ' dot product =' , dotp end program list2_3

専門家に質問してみよう