2004/04/27 # 前回まで 数の表現を方法を学んでいた 計算機の数の表現は、「状態」と「数」を対応させているだけ 「状態」は、on/off ( これが二進法 ) 1 bit が基本 計算機では、有限状態しか表現できない 例 : 計算機の整数は 32 bit 本当の数なら、整数同士の和は、整数 計算機の世界では、その値が 32bit 内であれば Okey そうでない場合は NG となってしまう.. 状態と数の対応規則の例 整数の場合は、2 の補数表示 現在の計算機は殆どこれ 他の対応方法もある 1 の補数表示 絶対値表示 # 既に、「歴史」になってしまっている。 # 重要なことは「対応規則」なので、「それが唯一ではない」 # ということ == # 今週 実数の表現 科学計算上の数値表現の一つ 指数表示 仮数 x 10^指数 例: 3.0 x 10^10 ( 光速度 ) 科学計算では、 有効桁数を仮数部の長さで表す 数の意味としては、 1234560000 = 1.23456 x 10^10 だが、前者は、10 桁有効だが、後者は 6 桁有効の意味 # 実験の測定では、制度が色々 # 電圧 : せいぜい 3 桁 # 地球の一周 : 11 桁位 Okey 実数を、仮数部と指数部に分けて、計算機内部で表現した形 浮動小数点数 実数の近似になっている。 # 計算機で表現できるのは飽くまでも状態 # 状態は有限なので、無限になりうる実数をそのまま表現できない # 状態に対応する実数の集合を考え、与えられた実 # 数をそれに近いその集合の中の実数に近似している (数学の) 実数 幾らでも細かくできる ( 稠密性/連続性がある ) 浮動小数点数 疎ら # ざるで掬ったかんじ.. 倍精度にしても、ざるの目が小くなるだけ 近似度は(整数に比べ)更に悪くなっている 浮動小数点の表現 基本は、指数表現と同様 ただし、二進数 仮数部 / 基数 / 指数部 32 bit の場合 ( 頭から.. ) [ IEEE 規格 ] 1 : 符号 8 : 指数部 23 : 仮数部 # このようにすると、浮動小数点数同士の比較が、 # (同じ bit パターンの..) 整数の比較と同じ結果に.. ## 比較回路が、整数と実数で共有可能 # 計算機の話 # 単純なものを確実にやればよい # 量が増えれば、ややっこしいが、難しくはない。 # IEEE - アメリカ電気学会 # Intel の Processer の形式 # 8087 ( 8086 の Co Processer ) の形式がそのまま採用された 浮動小数点の表現 ( IEEE 形式 ) の詳細 32 bit 1 8 23 符号 指数部 仮数部 正規化と仮数部の表現 ( 吝表現 ) 次の数は同じものの違う表現 1.23456 x 10^8 12.3456 x 10^7 0.123456 x 10^9 0.00123456 x 10^11 最初の3つはともかく、最後の一つの先行する 0 は意味が ないそれでも、仮数部にこれを表現するには、bit を割り振 る必要がある。 # 有限なので、無駄な表現はしたくない ## 無限な桁 (数学の数) なら気にしてもしょうがない 正規化を行う ( 表現の無駄をなくすための工夫 ) 先頭には、0 をこなくする 十進の場合は、0 以外には、1 - 9 がある 二進の場合は、0 以外には、1 だけ 正規化すると、先頭は必ず 1 表現する意味がないので かかなくてもあると思う。 吝表現 # 例外は 0 # 0 の時のみ特別扱い # 仮数部は、23 bit だが、有効桁は ( 隠れた 1 # を利用して.. ) 24 bit Q. 0 のときには、どうのように表現するの ? A. 0 は特別扱い !! # 指数部も合せて考え、all-0 が 0 考える。 ## 仮数部だけを考えると、確かに 0 は表現できない !! 計算機の中の データ ( 32 bit の状態 ) は、整数なのか浮動小数点かはわからない 比較する時に整数の比較結果と浮動小数点を比較結果が一致するように 浮動小数点の bit pattern を上手く設計してある。 # 昔の IBM 7090 などは、そのような形になっていなかった ## 整数の比較 ( CMP ) と、浮動小数点 ( ECMP ) と二つの ## 比較命令があった。 ## 単に、回路が簡単になるだけでなく、命令数も減らるというメリット !! この結果、整数の 0 も浮動小数点の 0 が一致している必要がある。 指数部の話 まず、指数部と仮数部を合せると、絶対値表現になっていること注意。 # これは、浮動小数点と整数の順序を対応させるため !! 8 bit なので、2^(-128) から 2^(127) の間 10 進では、10^(-38) から 10^(38) の間 指数と bit パターンの対応をどうするか ? 二の補数でもよい IBM 7090 実際は、次のようになっている。 00000000 2^(-128) .. 11111111 2^(127) n : 符号なし整数 2^(n+128) 下駄ばき表現 # この結果は、整数と実数の比較が一致する ## この仕組を考えた時に、集積度が低かったの様々な工夫がされた.. 0 の時だけ特別扱いし、all-0 を 0 とする。 == 倍精度 ( Text p.6 ) 64 bit 1 + 11 + 52 指数部が 8 から 11 ( 10^300 位 ) になっている。 # 電子のシミュレーションをすると.. # 10^100 位の制度が必要 # 単精度だと辛い.. 倍精度だと嬉しい a = 10^20 b = 10^20 c = a x b = 10^40 単精度では、表現できない ( オーバーフロー ) 倍精度なら、Okey # ここまでは嬉しい.. 倍精度の数を単精度の変数にいれる場合もオーバーフローが生じる可能性がある 計算によってオーバーフローが生じるのは納得できる 代入だけオーバーフローが生じるのは混乱を招く # 気をつけよう !! # この手の話は、1, 2 年に学んで欲しかった.. # この話は、テストにでない # 覚える必要もない ( 必要なら、資料を読めばすむ ) # このような問題 (特殊な状況) があるのだということは # 理解していて欲しい [注意] 現在は、どのプロセッサも数の表現は、統一されているので同じ # 昔は、それそのものが異った しかし、(プログラムが同じでも) 計算結果が等しいわけでない # 計算順序や中間結果のためのメモリのサイズ等で異なる ## 最適化の違いによって、同一 CPU 間でも行なる。 # 数値表現が IEEE で統一されているからといって、計算結果が一致 # するわけではない == 05/27 頃から、実習スタートの予定