- ベストアンサー
FORTRANの問題
今、大学でFORTRANを習っているのですが、先生の出した例題で、 N = 5 A = 1.1 A = A * N WRITE (*,*) N, A この場合、ディスプレー上に表示される変数Nと変数Aの値は各々5と0.0になる、この理由は? というのがありました。しかし、自分で勉強した限りはどうしても変数Nの値は5.5だと思うのですが…でもやり始めたばっかで自信もありません。どなたか教えていただけませんでしょうか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
もし先生に「正解」を聞けたのならぜひ補足なりしていただきたいのですが、 それともかく、さらに調べたところでは 実数 × 整数 という式が現れたときに、整数のほうを実数に変換して実数同士の式として 計算しなければならない。と決まったのは Fortran 77のときのようです。 それ以前はどうなるかは決まっておらず、コンパイラにより挙動が異なっていた 可能性はあります。 規格書を探してみたのですが、新しい規格(Fortran 90準拠)が決まった時点で 前のものは破棄されるようで、ネット上では見つけられませんでした。 一応まとめると、Fortran 77以降(77, 90, 95, 2000, ..)であってかつ規格をきちんと 守ったものであれば 5.5になるはずである。 77よりも前のもの(66, IV, III ...)については明確な規則は決まっていない。 といったでしょうか。
その他の回答 (4)
- sakusaker7
- ベストアンサー率62% (800/1280)
ちとカンニングしました(笑)が、やはり 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世紀の今は避けてしかるべき 過去の習慣だろうと思います。 パズルとしての問題ならいいでしょうけど、どういう意図を持って先生が このような問題を出されたのか疑問です。
お礼
ありがとうございます! 僕の持っている教科書にも(整数)×(実数)は自動的に(実数)×(実数)になると書いてあったもので… じゃあ5.5ということでいいんでしょうかねぇ…
- chukenkenkou
- ベストアンサー率43% (833/1926)
どこのメーカーの何という名前のコンパイラを使用していますか? 少なくとも、#2さんの回答にある >型の異なる変数どおしの演算を行うと「偽」となり、ゼロを出力 という話は、整数型と実数型の間では聞いたことがありません。
お礼
ありがとうございます! え…そうなんですか?じゃあ#2の方は… コンパイラとかはよく分からないのですが、FORTRAN77というのを勉強しています。
- vaio09
- ベストアンサー率37% (756/2018)
先生の言うとおりです! 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学期のこの時期に出す問題としては、小粒でキリリとしていて良い問題ですね。 悩んだ分だけ、ずっと覚えておける良問題ですよ。
お礼
ありがとうございます! そうなんですか…偽となったら0になってしまうんですね。ありがとうございます。 先生はうちの学部の一番偉い人みたいです。やっぱり教師としても優れているんですね!
補足
#3、#4の方の意見を参照する限り、A=5.5みたいなんですが… 先生も忙しい方なので、疲れていて間違ったんだと思います。
- asuncion
- ベストアンサー率33% (2127/6289)
私は、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になるはずです。 それとも、どこかに深~い落とし穴でも潜んでいるのでしょうか…。
お礼
ありがとうございます! そうですよね…まず0.0なんかどっから出てくるんだよ!って感じです。
お礼
ありがとうございます! 明日ちょうど授業があるので先生に聞いてみます。