数値解析法 (Fortran 編), 2006-06-16 質問とコメント, M は宮本によるコメント。 h03s2006: windowsでもfortranが使用できるという話を聞きました。windowsでfortran を使用しプログラムAを作成しコンパイルできたものが、Linuxで同じプログラムAを作成 したのにコンパイルエラーが出てしまうことはあるのでしょうか? M: 特に Fortran のような高級言語の規格は OS に依存しないはずなので, どこでも 同一のソースが使えることが原則です。しかし, 個々のコンパイラの実装の差により, または警告のレベルにより, 出力されるエラーメッセージが異なる可能性はあります。 第二の可能性は, 当該コンパイラの Fortran90 拡張機能を使っているかどうかです。 テキストのサンプルプログラムは, 厳密には Fortran77 レベルを越えていますので, 対応していないコンパイラならエラーとなるでしょう。第三には, 当該 OS または ハードウェアに特化した拡張を使っている場合。たとえば windows に特有のハード ウェアを操作することに相当する命令が含まれているとか。マイクロソフトの製品は, ときどきそういう標準からの逸脱行為があるんだよね〜。 h03s2011: リスト9の19行目にparameter (pj = 3.1415........D0)とありますが 最後のDOに特別の意味があるのですか? M: 「10 のゼロ乗」ですから 3.14... と書くのと同じに見えますが, 倍精度の実数で あることを意味しています。したがってコンピュータ内部でこの数を扱う時に, 代わりに「E0」と書いたりまたは何も書かないものと比べて, 数値の精度が異なって います。ていうか, 2006-06-09 の h04s2022 も参照してください。 h03s2069: fortranで計算をするにあたって、結果に誤差が生じることになるのですが、 仮に、誤差の許されない、精確な計算をしなければならない場合、どうするので しょうか。その場合は、fortranでは計算しない、ということになるのでしょうか。 M: たしかに言語によっては計算誤差を生じないことが規格化されているものもあり ます。たとえば事務計算に用いられるという cobol は, 経理の計算で計算誤差による お金の過不足があっては一大事ですから。しかし科学技術計算ではそれほど気にしない というか, 誤差をコントロールする方向ですね。そもそも測定には誤差が伴うし, 有効数字という概念もあるしね。ちなみに 2006-06-02 の h03s2011, h04s2016 なども 参照してください。 h03s2090: FORTRANで作ったPROGRAMは いろいろ文章があり、順番があり、人間が理解 しやすいということがよく言われてきた、だが、最初にこの言語を学んで、そう思わ ない、例題があっでも、わかりにくい、どういうふうにやれば、わかるのを教えて ください。どこからもわからないです。 M: 「c = a + b」という一行と「mov a, (0x0010); mov b, (0x0020); add a, b; mov (0x0030), a」 という四行 (``;'' で改行) は, どちらが分かりやすいですか ? わからないのは文法 (syntax) ですか, それともアルゴリズム (algorithm) ですか ? あなたにとって「何が」「どう」わからないのでしょうか ?? 漠然と全体がわからない (all or nothing) というのでは, 科学的思考とは言えません。 h04s2005: 練習問題の中で、「発展課題として規約分数にできたら…」と書いてあり ますが、それを達成させるためには何か他の参考書等で勉強するべきですか? M: 「べき」かと問われれば, そんなことを強制しません。すなわち, 独自の手法を 発案しても良いし, 既存の方法を探しても良いんじゃないでしょうか ? 必要だと思う 人が必要だと思うことをやればいいです。大学での自主的・自発的勉強って, そういう ものなのではありませんか ????? h04s2017: fortranで図形を描写することはできますか? M: Fortran の文法要素にそのようなものがないことは, 文法書を丹念に読んだら, すぐにわかることでしょう。さて, 描画するには, 具体的なキャンバスと絵筆が必要 ですね。紙とペンならプロッター, 紙とインクならプリンタ, 画面と輝線なら ディスプレイ, 仮想のキャンバスと筆なら記憶領域と点の有無なのでメモリが, それぞれ必要ですね。具体的な出力装置がコンピュータに接続されているならば, 信号線にデータを送るだけですから, 使えるかどうかは使用言語とは無関係ですね。 原理的には。 h04s2020: プログラミングに対する苦手意識をなくすためにどう生活すればいいですか? M: h03s2090 が参考になるかもしれません。 h04s2021: fortranのような言語は個人でもつくることができますか? M: もちろん。BASIC だって C だって, 最初は小数の個人が作ったものです。 また perl, ruby なんかも個人でやってますね。 h04s2022: fortranには77と90があるようなのですが、そんなに違う部分があるの ですか?確かに、入力には多少違う部分が見受けられますが、そこまで大きく入力する 量が減るなどの変化は見られませんが・・・もっと難しいプログラムを入力すれば ぜんぜん違うのですか? M: 簡単なプログラムでは差が見えにくいですね。変数の型宣言のやり方は, 少し違い ますね。でも古いやり方も許容されているので ...... それ以外にも, case, cycle, while などいくつかの文が追加され, 増えています。 ----- 8< ----- 8< ----- program input_example integer :: i, j real(kind = 8) :: a real(kind = 4), dimension(20) :: b character(len=12) :: chars read (*, *) i, j, chars a = i + j b(3) = i * j stop end program ----- 8< ----- 8< ----- h04s2024: Fortranには無限の可能性はありますか? M: 2006-05-26 の h04s2017 を参照してください。 h04s2027: ゲームや動画のプログラムもこのfortranで作成できたりするのでしょうか? ゲームでのボールでの軌道もプログラムでそのつど計算されているのでしょうか? M: h04s2024 を参照してください。ゲームのプログラムの中身は, 機器の制限が大きい ので, それぞれに応じて色々な手抜き^H^H^H工夫をやってることでしょう。 昔なつかしゲームボーイでは, 表示の液晶のセグメントが限られていたので, 普通に 意識する軌道の計算よりは, どのセグメントを表示するかの選択でしょうね。 h04s2028: 先生はFORTRANを使いはじめたころどんなところに苦戦しましたか? M: それ以前に BASIC とかマシン語 (Z80, 6809 など) を少しやっていたので, 文法や アルゴリズムに戸惑いはありませんでした。それよりも, マークシートのカードの マークと処理依頼から結果の返却まで数日かかること, TSS で利用できるようになって からも独自の癖の強いスクリーンエディタの使い勝手に苦戦しました。 h04s2030: 先生は歴史が好きなのですか?テキストの中に豊臣秀吉の名があったので。  if文の中にif文を置くことは可能だと思いますが、その場合最初のifよりもマスを 下げるだけで実行してもらえるものなのですか?このようにしたら、動いてくれません でした… M: 特別に歴史が好きなわけではなく, 普通だと思います。 if 文の階層化については, if --- end if のブロック構造に注目しましょう。 サンプルプログラムでは, 空白行や字下げをつかいブロック構造を, 人間に分かり やすく記述してみました。なお空白行や字下げはコンピュータにとっては無意味で 無視されます。 h04s2032: LinuxはCDやDVDやストリーミングを見たり聞いたりできるんですか? M: ハードウェアの操作やデータ処理は, それ用のプログラムが実行する仕事であって, OS とは無関係です。具体的個別のプログラムがどの OS 上で動作するかというだけの 話でしょ。ちなみに Linux で CD の音楽やネットラジオを聞いたり, 動画を再生したり することは可能だと思います。たぶんやってる人もゴマンといることでしょう。 具体的にどうするかは, 私は知りませんので, 自分で調べてください。 h04s2034: 私達が普段使っている関数電卓は今回の授業で行ったプログラミングで 作られているんですか? M: 「プログラム」という意味では yes でしょう。しかし「今回の授業で...」と なると, たぶん no でしょう。関数電卓はパーソナルコンピュータよりもはるかに ハードウェアの制限がきついので, お気楽なプログラミングでは太刀打ちできない でしょうね。 h04s2036: リスト11の20行目のformat文のe12.6とはどういうことですか。 また、たとえばread(5,'(I4,1X,I4)') X,Y はどう対応しているのでしょうか。 M: 正確で詳しいところは, ちゃんとした文法書を見てください。 「e12.6」は全体で 12 桁で, そのうち小数点以下部分の表示に 6 桁使う。 「read(5,'(I4,1X,I4)') X,Y」は, 行頭から始まって X も Y も整数 4 桁で, 間に空白 1 文字分。 h04s2038: FunctionとSubroutineの違いは何ですか?? M: こんなこと, 文法書に書いてあるんじゃないんですか ? 関数は値を返すし, サブルーチンは返さない。そういう違いによって記述や呼び出し方が違う。 もっとも関数が返した値を使うかどうかは呼び出し側の問題なので, 呼ばれた関数には わからないことだとすれば, 二つを区別する意味が無いと言えるかもしれません。 C 言語ではそういう立場から, サブルーチンは存在せずに全てが関数です。 h04s2039: dungeonとは何ですか? M: 2006-05-26 の h04s2017 を参照したり, ググってみてはいかが ? h04s2042: 一般のゲームソフト(テレビゲームなど)はどのようなプログラムで作る ことができるのですか?もしやfortranでつくれるのですか? M: h04s2027 とかも参照してください。 h04s2043: 定数や変数の精度については,言語によって規格化されているんでしょうか? M: Fortran について言えば, あつかえる数値の範囲が規格化されていますね。 一方, 精度に関係する計算機イプシロンは, 実装依存かも。 h04s2044: Fortranのプログラミング中でも種類があるんですか? M: 質問の意味が分かりません。「プログラミング中」の「種類」って何ですか ? h04s2046: プログラム言語ほ何種類ぐらいありますか。 M: いくらでも。もしもあなたが新しい言語を開発し, その処理系のプログラム (コンパイラなど) を作成すれば, 現在数はひとつ増えます。 h04s2048: 現在FORTRANを勉強していますが、FORTRANで作ることができない数値解析は ありますか?また、それはどんなものですか? M: アルゴリズムをきちんと定義できれば, たぶん作成可能でしょう。ですから, できないものが何かあるのか, わかりません。 もちろん計算不可能な問題もあります, でもそれは汎用のアルゴリズムが定義できない から, どんな言語でも解析不可能です。ゲーテルの不完全性定理とか, プログラムの 停止問題とか, 有名ですね。 h04s2054: この授業で使っているマウスの仕組みってどうなってるんですか? M: 光学マウスのようなので, 発光素子と受光素子が対になって底面にあって, マウスパッドや机の面の凸凹で反射光が断続的に途切れるのを検出して前後左右の 移動量とし, またボタンやホイールがスイッチになっていて, 押した離したや回転量を 検出しているのだと思われます。一度, いらなくなったマウスを分解してみたら ? h04s2057: Listing9 の13行目の記号と Listing10 の15行目の記号は何を表すもの なんですか?関数副プログラムやサブルーチン副プログラムとの切り替えを表すもの なんですか? M: 第 1 桁に c (または大文字の C または *) を書くと, その行はコメント行として あつかわれ, プログラムの実行には影響しません。したがって当該行は, プログラムの 実行には何ら影響ありません。一方で, ソースプログラムは人間が読みやすいように 分かりやすいように書くことが推奨されます。当該行の有無でどう違うでしょうか ? h04s2058: 見やすいプログラムを作るために先生はどのようなことを心がけていますか? M: プログラムの構造を意識して, 論理的なブロックを見掛けの上でもブロックにする。 変数名や関数・サブルーチンに, 意味のある名前や系統的なルールを持った名前を つける。分かりやすい処理手順 (アルゴリズム) を考える, 過度にアクロバティックに しない。 h04s2059: 練習問題1の分数の形で表示というのは、1/5のような形でしょうか? それとも 1 ― 5 のような形でしょうか? M: その点について問題には指定されていませんね。すなわち解答者の裁量の範囲内 です。 h04s2062: BJゲームのBJとは何の略ですか?Black Jackの略ですか? M: そうお考えいただいても結構です。ちなみにこの質問は, 十点満点で何点を獲得する つもりでしたか ? h04s2063: “dunjeon”の魅力ってなんですか? M: dungeon のことでしょうか ? h04s2039 も参照してください。探検はお好きですか ? h04s2070: 今現在出回っているFortranの最新バージョンはいくつでしょうか? M: たぶん Fortran2003 だと思います。2006-06-09 の h04s2042 も参照してください。 しっかし Fortran2003 の仕様は, なかなかの化け物のようです。巨大恐竜かも。 h04s2071: emacsでリスト3の配列をプログラムをしたのですが、リスト3を少し変えて プログラムして、./を使って内容を確認しようとしたのですが、許可がありませんと しかならなかったのですが、どうしてでしょうか? M: 「./を使って内容を確認しようとした」の意味が分かりません。 h04s2073: 容量がまだまだ空いてるのに自分のパソコンの動作処理が遅いのですが、CPU を変えると早くなりますか?また、変えるのは難しいですか? M: CPU を変えても, たぶん早くならないでしょう。CPU のクロックを速くすれば, 処理速度の向上が期待できます。しかし処理速度の律速になっているところを見極めて 対処しなければ, 根本的な解決には至らないと思われます。当たり前のことですね。 h04s2075: 実数型と整数型の混用は好ましくないとされているけれども、実数型の 整数乗だけは例外で、例えば、x**2(x^2の意味)などは問題がなく、あわせて x**2.0と書くよりもよい結果を得ることができるのは、なぜですか? M: 賢いコンパイラなら, 二乗などかける回数のわかっている整数乗は, 例えば x**3 を x*x*x とするように, 普通のかけ算の繰り返し実行に置き換えてしまいます。一方, 指数が実数の場合などは, より一般的な計算方法として, x**a を exp(a*log(x)) と 展開します。これは数学的には等価ですし, 指数 a がどんな値でも成り立ちます。 しかし log とか exp という組み込み関数を使用しているために, 非常に大きな計算 コストがかかりますし, 計算誤差がはいりこむ余地も生じてしまいます。 h04s2076: プログラムがうまく作動せず、発狂しそうです。してもいいですか? M: 他人に迷惑がかからないようにしてくださいネ, 二十歳過ぎの大人なんだから。 h04s2078: 自分で作ったプログラムで今でも使っているものはありますか? M: 2006-05-26 の h04s2036 あたりを参照してください。 h04s2081: windowsと授業で使っているOSとの一番の違いは何ですか?パソコン利用方法 で違いが出てくるのですか? M: 使用権を得るために金銭が必要かどうか, 一般のユーザーに修整する権利があるか どうか, という点かな。キーワードは「free」ですね, 無料と自由の二重の意味で。 h04s2085: 先生は、この課題を終わらすのに何日(何時間)かかったか? もし、一般的な生徒はこの課題はどの程度かかるか? M: そりゃぁ私は完成形のイメージを持って出題していますから, 小一時間もあれば だいたいできると思います。測ってませんが。学生さんがその十倍かかったとしても, 数時間×三日 もあれば充分じゃないですか ? h04s2086: fortran77以外のfortranはどのような利点がありますか。 M: 「fortran77以外のfortran」とは具体的に何のことですか ? もしも Fortran90 の ことならば, より自然に論理を記述できるようになったことかな。その程度の拡張は g77 に少し採り入れられており, みんなが既に使っています。 それ以上のことは, ぜひ自分で調べてみてください。