2004/04/20 のメモ Fortran の人の為の教科書 戸川隼人 先生 著 「数値計算」 岩波書店 == 講義の内容 数値計算 [例] 数値シミュレーション シミュレーションは、計算機を使わない場合もある フライトシミュレーション 機械を作っていると大変、 数値シミュレーションの方が安価 数値計算の一部 なぜ、数値シミュレーションをするか ? 問題を解きたい 本当に計算機を使うべきか ? 実際に実験できるならば、その方がいいに決っている 計算機の方が易い そもそも実験できないこともある 過去の事象の再現 人命に拘るような内容 実験では、なかなか、情報が取り出せない 例 風洞実験 実際の結果と異なる まず、大きさが異なる 飛んでいないので、棒で支える必要がある 測定するには、測定機が必要 測定機の存在が、実験内容をみだす。 計算機 (シミュレーション) と実験を組合せることが望ましい。 シミュレーションの重要な分野 自動車の衝突実験 人命がかかわるので. 講義の内容は、非線型方程式からはじまるが.. 計算機の内部での動きがわからないと、困るので、そこから話を始める == 計算機の内部構造 数の表現 十進法 人間が日常的に利用している形式 電気で実装するのは難しい [例] Audio のアンプなど.. 二進法 計算機が利用している形式 Why ? -> 実装するのが易い ( 簡単 ) だから 電気の On/Off ( Switch ) で実現可能 一つの Switch で、二つの状態 (on/off) が表現できる n 個の switch で、2^n の状態が表現できる。 on/off という明かに異なる状態 ( Digital ) は扱い易い。 現行の PC ( 皆の PC ) 64M bit = 10^8 の素子 特性を整るのは大変 digital なら Okey 間違いがない # 十進法の計算機も作られたが、二進数のものに駆逐された # 四ビットを十進一桁にするという表現方法はまだある # 厳密には、二進法の仲間と考えてよい 一つの switch で表現できる情報量 1 bit 二進数と十進数は 1 to 1 なので、それほど違わない # 但し、計算機では、「無限」は扱えないので注意 !! ## この制限は、計算機を扱う上で本質的 # 2 進数と、電気回路の関係を示す講座が必要か ? # せめて、IC / 論理回路 / ハーフ加算機位まではやっておきたい.. 計算機で扱える数の範囲 数学 計算機 --------------------------------------------- 自然数 「整数」に同じ 整数 「整数」 ( 固定小数点数 ) 二進数法表現 実数 浮動小数点数 計算機で扱える数は有限 !! 二進数法表現 1 ビット 2^1 = 2 の状態 2 ビット 2^2 = 4 の状態 1 word = 32bit 2^32 = 4 * 10^9 の状態 小遣いとしては、十分な大きさ 国家予算としては、少い.. # [余談] 「零の発見」 # 0 の発見 ( 印度で発見されたらしい.. ) この「状態」を、どんな「数」の対応すべきか ? # 対応関係 ( = mapping ) を考える必要がある。 # 二進数は、単なる状態空間を区別する記号と考えてよい # 二進数(状態空間)と現実の値(整数など)の対応を決めることが本質 # Mapping は Rule なので、どのような対応でもよい # 対応の適用が一貫していれば Okey 案 1 : そのままとする 0 0 1 1 .. .. 4^10^9 4^10^9 これだと、負の数が表現できない。 案 2 : 半分を正の数、残りを負の数にする よさそう.. でも、0 は ? 状態の数は、偶数個なので、正負の数は良いが零だけ扱いに困る。 二つの流儀 +- 0 の両方を許す 0 は正の仲間として扱う 具体例 ( 4 bit で示す ) 状態 素直 絶対値 二の補数 一の補数 (CDC 6600) 8421 0000 0 0001 1 0010 2 0011 3 0100 4 0101 5 0110 6 0111 7 1000 -0 -8 -7 1001 -1 -7 -6 1010 -2 -6 -5 1011 -3 -5 -4 1100 -4 -4 -3 1101 -5 -3 -2 1110 -6 -2 -1 1111 -7 -1 -0 正の数は素直に考えてよい 負の数をどうするかが問題 [絶対値表現] 負の数と正の数がある 符号を表現する bit ( 符号 bit ) を一つ設ける 残りのビットは、絶対値 解りやすい 回路を作るのが大変なので、現在は作られていない 昔 IBM 709 (真空管) IBM 7090/7094/7044/7040 (トランジスタ) 実装が大変 なぜ、作るのが大変 ? a + b を考える a, b の符号によって、対応方法が異なる a/b | 正 | 負 ----+---+---- 正 |加算|減算 負 |減算|加算 符号判定と、加算と減算回路の両方が必要 # 実は、数の表現を工夫すれば、減算が不要になる。 # [原理] 「補数」を考える / 有限であることを利用 ## 計算機で扱いやすい演算の組み合わせで、作る !! 0 が正と負の両方がある 5, 4, 3, 2, 1, 0, -1, -2 一ずつ減らすと -3, -2, -1, -0, 1, 2, 3 一ずつ増やすと 1 + (-1) = 0 となるような (-1) とは何か ? つまり 0001 + ???? = 0000 となる ???? が -1 だと思うことにする ???? は 1111 となる 実際 0001 + 1111 = 10000 であるが、下の 4 桁しか使わない ( 有限なので.. ) 0001 + 1111 = 0000 となる。 # 桁数が有限 = 剰余計算だと思う # 「そろばん」と同じ仕組 # なんだか騙されているような氣がするが.. でも、上手くいっている.. ## 「正体」は、「剰余類」 [2 の補数表現] 「補数」の計算をどうするか ? 各々のビットを反転 ( 0/1 ) して、1 を加えれば良い。 利点 符号の区別が不要 減算が、補数の加算で実現できる # 補数の計算は、減算より簡単.. # 教科書には、「2 の補数表現」しかない # なぜ、「絶対値表現」を説明したか ? # mapping の話をしたかった # 考え方が広がる # URR (浜田先生) # 浮動小数点も.. # bitmap ( 絵 ) も.. # その他、様々なデータ (情報) が表現できる.. # 負の数が出ないのであれば、全て、正の数だと思う ( unsigned ) == [まとめ] 計算機内部の数表現 on/off のスイッチで 1 bit ( 0/1 ) を表現 n 個の bit で、数値を表現 ( 二進数 ) 負の数の表現は、「二の補数」表現 -a = 2^n - a ビット反転を行い 1 を加える # 計算回路が簡単になる。 == 教えているのは正しいという保証はない # 聞いている方も緊張感を !!