数値解析法 (Fortran 編), 2002-06-07 質問と回答 M は宮本による回答。 h99s2076: UNIXでのメールの送信法はどうやればいいのですか? M: 下の [*1] を参照してください。 h00s2003: なぜプログラムの段階なのに文章を認識できるんですか? M: 質問の意味がわかりません。今日は「文章認識」の話をしましたっけ ? h00s2008: プログラムを製作中、画面の下に方に記号がたくさん出てプログラムが 書けなくなったんですけど、どうしたらいいんですか? M: 私は超能力者ではないので, これだけの記述から何が起ってどうすればよかった のかなど, わかろうはずもありません。 h00s2009: Fortramの文法は講義で習うものだけで十分なんでしょうか? M: 人それぞれです。充分な人も不十分な人もいると思われます。 h00s2015: implicit none の使い方が、あまりわかりませんでした。 M: 変数宣言の前に, そのままそのとおりに書くだけです。 h00s2018: プログラムというのは、将来パソコンを扱う上で必要となるのですか? どのような、プログラムですか? また、将来 情報化社会が、進む中で、 プログラムの必要性を教えてください M: 基本ソフトといわれる Unix や Windows にしろ, アプリケーションの emacs や MS Office にしろ, すべて (誰かが作った) プログラムです。 「コンピュータ, ソフト無ければただの箱 (詠み人知らず)」 h00s2021: 睡眠時間は何時間ですか? M: 人それぞれだと思われます。 h00s2022: コンパイルの仕方がわからなかった。muleとemacsなどUNIXの用語のいみが わからない。 M: 下の [*2] を参照してください。下の [*3] を参照してください。 h00s2024: コンパイルの意味を教えてください M: 言葉の意味が知りたければ, 辞書で compile を調べてみましょう。 ここではユーザーが書いたプログラム (テキストファイル) をコンピュータが直接 実行できる機械語に翻訳する過程のひとつです。厳密には, 実行可能ファイルを生成 するためには, ライブラリなどとのリンク (link) も必要ですが, ここでは コンパイル に引き続いて リンク を行ない, これらの過程を一括して処理しています。 h00s2027: ユニックスになれていないので、はっきりいってどこがわからないのかも わかりません。バッファーでコマンド入力でコンパイルする方法が知りたいです。 M: 下の [*3] を参照してください。下の [*2] を参照してください。 h00s2028: 今日おこなった四則計算のプログラムで数字を二回入力するとき二つ目の 数値をゼロと入力すると商が‘−1’と画面に出たのはなぜですか? M: 下の [*4] を参照してください。 h00s2030: 今回、shisokuをコンパイルするのに、Kterm windowでコンパイル作業を しましたが、emacs windowでそのままコンパイルできる方法があると思うんですが、 それを教えてほしいです。 あと、質問メールを送るのに、わざわざwindowsを開かずに送れる方法をぜひ お願いします。 M: 下の [*2] を参照してください。下の [*1] を参照してください。 h00s2032: 出席しました。質問は特にありません。 M: そうですか。でもメールが要件 (何らかの質問を含むこと) を満たしていません。 h00s2033: 今日の授業よくわかりました M: そうですか。でもメールが要件 (何らかの質問を含むこと) を満たしていません。 h00s2035: emacsと入力して文章を入力したのですがうまく起動しませんでした。 代わりにmuleで文章を作って実行したらうまくいきました。なにかわたしに不備が あったからでしょうか? M: 不備が無ければうまくいったはずという仮定に立てば, 不備があったと思われます。 h00s2039: fortranで微分や積分などの計算はできないのでしょうか M: 原理的には可能です。プログラムしだいだと言えるでしょう。 (要望については善処します) h00s2045: 最後のレポートについて 期限はいつまでなんでしょうか M: 「Fortran 編の終了後一週間以内」と Web ページには書いてあります。これ以上の 解説が必要ですか ? h00s2050: 質問はどうゆう質問してもいいんですか? M: 特に制限はありません。一方, 質問者が期待した解答 (solution) がつくという 保証もありません。私が書いているのは単なる回答 (response) です。 h00s2052: はじめの6文字、空ける理由がよくわからなかったです。 M: Fortran の文法で使い道が決まっていて, 今回はその必要がなかったからです。 h00s2053: プログラムを書くとき、書く順番は決まってるのですか? M: 質問の意味があいまいです。例えば今日のプログラムで, 計算式の次の行に read 文を書くという意味ですか ? h00s2057: この授業で、最後にプログラムを提出するとあるのですが、その物理の 式などをどうやったら作れるのかは教えていただけるのですか?もしかして自分で 調べて作るのですか? M: 式は本に書いてあるもので充分ですが, プログラムは各自が作る必要があります。 h00s2058: 数式で平方根を扱うときはどうしたらいいんですか? M: 平方根って特別扱いしなきゃいけないような数字なんでしょうか ? それとも質問はそういう意味ではない ? h00s2059: fortranはどういう場面で使われるんですか? M: 言語なので, プログラムを記述するときに使われます。 h00s2060: 何故Fortranは72文字が限界なのですか?歴史的経緯を教えて下さい。 プログラムの途中に空白が入っていますが、式の途中などに勝手に入れてもいいの ですか。(例えばa*b=とa * b =) M: 詳しくは成書にゆずるとして, Fortran が開発された当初のコンピュータの入力 装置はカードリーダーでした。文字に対応した位置に穴をあけるパンチカードです。 そのために カード一枚 = 一行 = 72 桁 の制約ができたと推定されます。センター 2F のラウンジのガラスケース内に古いカードが展示されています。 また式の途中の空白は無視されますので, 人間が読みやすいようにしてかまいません。 h00s2061: 今回のプログラムでは、整数を扱ったプログラムでしたが、プログラムを 少々書き換えて実数を扱えるようにしたのですが計算させた数値がどれも有効数値 7桁で終わっているのはどういうわけでしょうか? また、このコンピュータで扱える数値の桁数はどれだけ扱えるのでしょうか? そして、どういった理屈で制限されたり設定がなされているのかが今回の質問です。 M: Fortran77 であつかえる実数には, (単精度) 実数と倍精度実数という精度の 異なるものが二種類あります。有効数字はそれぞれ, 単精度実数では概ね十進で七桁, 倍精度実数では概ね十進で十六桁です。これは Fortran 言語の規格で決まっています。 有限のメモリを使って実数を表現しようとすれば, 自ずと精度に制限をもうけざるを えませんね。 コンピュータで扱える数値の精度 (桁数) は, 多倍長計算という特殊な方法を用いる ことで, 原理的にはいくらでも高精度にすることができます。この場合にはメモリと 計算時間にのみ制限を受けることになります。円周率 (π) を何億桁も求めたという 話を聞いたことはありませんか ? h00s2062: プログラムを作る時、最初の6文字を空けるのには歴史があると言って いましたが、なぜ、そういう面倒な部分を改良しないんでしょうか? M: 過去に作られた膨大な量のプログラムを, 修正すること無しに使えるようにする ためです。「上位互換」という考えは技術の発展の歴史にはよく見られることですね。 Fortran 90/95 ではこの様な制約に縛られずに, 自由形式でプログラムを記述する こと *も* できます。(ただしその場合には継続行のルールは変更される) h00s2063: 整数以外のときの計算方法がわかりません M: 整数であろうが実数であろうが, 加減乗除は +-*/ ですね。 それとも質問はそういう意味ではない ? h00s2064: なぜ使い勝手の悪い四則計算をやったのか?前回の授業でやっていたので せめてもう少し難しい計算でもいいと思う。 また、なぜ数値が多いと文句をつけられるのか。 なぜ、0÷0がマイナス1になるのか? M: 使い勝手の良し悪しは主観ですので人によって感じ方が違うでしょう。またこの パートの目的は Fortran 文法入門であり, (難しい) 計算をすることではありません。 数値計算法については, 次の宮永先生のパートで習うことになるでしょう。 さらに, 全員に同時に最適な授業・演習を行なうことは不可能です。このパートの 講義資料は Web 上にありますので, 私の説明がまどろっこしいと思う人は, どんどん 先に進んでいただいてかまいません。 また, 「また」以下は状況がわかりませんので何とも言いようがありません。 最後にゼロ割るゼロについては, 下の [*4] を参照してください。 h00s2068: このメールは届きましたか。 また、連立方程式みたいなものはどうやったらいいのですか。 M: 届きましたので, こうして回答しています。 あなたは筆算では連立方程式をどうやって解きますか ? その手順をプログラムすれば いいのです。 h00s2070: 今日プログラムした四則計算はなぜ整数以外の答えが出ないのか、という 点が不思議に思った。 M: 計算結果を整数として得るように, そういう風にプログラムを作ったから。 「コンピュータはプログラムに書かれている通りに動作する。たとえそれが人の 意図と異なっていたとしても。(詠み人知らず)」 h00s2075: 商の値について。小数点以下が答えになるとき、答えがすべて『0』に なってしまいます。これはどうしてでしょうか?プログラム次第では小数点以下の 表示も可能になるのでしょうか? M: プログラム中で用いた変数が整数用のものだったので, 小数点以下は切り捨てられ ました。実数や複素数の計算を行なうためには, それ用の変数を確保して使わなければ いけません。 h00s2079: (*,*)に決まったのは何か歴史的背景があるのでしょうか。(例えば開発者 の洒落がそのまま採用されたとか)気になって夜も眠れません。 M: 本来はカッコ内には制御情報並びを書くところですが, そこを ``*, *'' とすると コンピュータの方で善きにはからってくれます。* はワイルドカードみたいなもの ですね。詳しくは文法書を参照してください。 h00s2082: x-terminalとwindowsの違いはなんですか?x-terminalだと、電子計算の プログラム以外にどんなことができるのですか? M: 字が違います。基本システムが違います。Windows は OS ですが X-terminal は 端末装置です。 X-terminal はホストコンピュータの端末装置で, ホストコンピュータは原理的には なんでもできます。 h00s2083: inplicit none の意味が説明を聞いてもいまいちわかりませんでした。 wa = aa + bb と write(*,*) " wa = ..... は入力する順は逆ではだめなんで しょうか? M: この時間ですべてを教えることは不可能です。各自で入門書・文法書を見ておさらい しておいてください。 また二つ目の質問について, 文法的には違反ではありませんが, 計算を実行する前に 計算結果である和を格納する変数の内容を印字することに, 意味があるのでしょうか ? h00s2084: 今日, 行ったプログラムで, 最後の方に「stop」というのがあったん ですが, 「end」があれば, いらないような気がしますが, ダメなのでしょうか。 私は, 以前「N88」というソフトを勉強したことがあるのですが, 今回, 勉強して いるソフトと, どこが大きくちがうのですか。 M: 今日示した shisoku.f では, 実行の終了地点がプログラムの末尾でしたから, stop 文は無くても動作に影響はありません。しかしこれらは常に一致するとは限り ませんね。 また「N88」が何を意味しているのかよくわかりませんが (もしかして N88-BASIC(98) とか ?), 特定の私企業の製品のことでしょうか ? もし私企業の製品であれば, その 仕様はその会社が独自に決定しますね。現実のコンパイラは製品である場合もあり ますが, でも Fortran 言語は ISO や JIS で制定されている (世界共通の) 規格です。 それとも, 英語と仏語のような違いとでも答えればいいのかな。 h00s5016: 今日のプログラムでの計算でルートやlogなどの計算はどのようにするの ですか? M: 組み込み関数の sqrt(), log(), log10() などを使うのもひとつの方法です。 方法はひとつだけとは限りません。 h00s5018: 今日は整数でしたが、少数や平方根、二乗、自然対数の計算はどのように やるのですか? 計算のほかにどのようなことができるのですか? M: あなたは筆算では二乗の計算をどのように行いますか ? そのとおりにプログラム すれば, 計算することができます。 計算の他にも, 原理的には何でもできます。 ところで「少数」とは ? h00s5028: C言語は少し勉強したのですが、もう少し複雑な数学計算をするsprt()の ような組込み関数はFORTRANにはないのでしょうか?もしくはCのように "*****.h"(ヘッダファイル)は必要ないのでしょうか? M: もちろん Fortran にも組み込み関数はあります。ヘッダファイルは文法要素 としては必要ありません。 ところで, 「もしくは」と言っていますが, 組み込み関数とヘッダファイルは相反する 概念ではないと思われますが, なぜ「もしくは」なのでしょうか ? h00s5051: 整数のほかにルートや小数の時はどうするんですか? M: *誰が* *何を* どうするのでしょうか ? [*1] Unix でメールの送受信: 普段は Windows でメールをやり取りしていると思いますが, Unix でもメールを 送受信すると, メールのデータが分散してしまいます。この意味がわからない人に Unix でのメールのやり取りはおすすめできません。 となりのコンピュータを Windows で起動するのが最も簡単です。 Unix でログインしたときに $HOME/windows/ 以下にファイルを置けば, そこは Windows でログインしたときの各自のネットワークドライブ (H: かな?) です。 [*2] emacs の fortran mode でコンパイルする: emacs のそのような機能はユーザーが設定するものであって, 初めからついている ものではありません。これをカスタマイズといいます。従ってどう設定されている のかは, 他人にはうかがい知ることができないというのが一般論です。 (でも当該の事項は C-c C-c らしい) これも結局は kterm のコマンドラインからコンパイルを実行することが基本で, C-c C-c はその代替ですから, 素直に基本通りにやることをおすすめします。 コンパイルエラーがあったりするとエラーメッセージをちゃんと見なくちゃ いけないし, どうせ実行ファイルは kterm のコマンドラインから実行するのだし。 コマンドラインでは, 例えば今日の例で言えば, f90 -o shisoku shisoku.f とすることで, shisoku.f というソースファイル (source, 源) をコンパイルして shisoku という実行ファイル (executable, 実行可) が生成されます。 [*3] Unix の基本: Unix の基本操作については前回までで一通りふれているはずなので, 復習して おいてください。Unix に限らず物事に慣れるためには, 本人の努力と練習が必要 だと思います。時間は毎週 168 時間づつありますので, 有効に使ってください。 [*4] ゼロ除算: ゼロでの除算は数学的には未定義ですね。ほとんどのシステムではセロ除算を実行 しようとすると, 実行時エラーになります。しかしこのシステム (prex1--4) では 実行時エラーにならずに -1 を返すようです。たぶん整数変数の全ビット 1 を返して きたのでしょう。 もともとできない計算なので, コンピュータが計算結果としてどんな値を返してきても 有意の計算結果ではありませんね。 エラーで停止しないのは, 数値計算をする上ではちょっと怖いかも。 -- 文責: rmiya