2005/04/26 数値解析学と演習 福井 先生 # 遅刻したので、前の部分が切れている ... (_v_) 実数値の内部表現 浮動小数点数 => 実数の近似 ( 0 に近いほど、制度が良い ) 科学技術表現形式 => 符号と指数部と仮数部の三つからなる バリエーション IEEE 指数部の長さはどうなる ? 8 指数の底は ? 2 指数部、仮数部の表現は ? 絶対値表現 現在利用されている浮動小数点数の形式は、IEEE 754 1 8 23 32 bit の場合 [-][--------][-----------------------] 符号 指数部 仮数部 S E M (-1)^S x 2^E x M # 表現可能な範囲 10^(-38) 〜 10^(38) 指数部 E / 仮数部 M は共に、絶対値表現 # 整数は、2 の補数表現なのに... => 統一されていない !! Why ? # 要するに計算機の都合 ( 比較回路を整数と共通にしたかった ) => 比較する時に、整数と同じ扱いにするため 浮動小数点 a, b の比較をするときに、 a,b のビットパターンと同じビットパター ンの整数 A, B を考えると、 A B を比較した結果は、a と b を比較し た結果になる。 # cf GE 635 は、この工夫がされていないので、CMP と FCMP # の二つの命令が必要だった。 ## GE ( General Electronic 社は昔は計算も作っていた ) [符号 ( 1 bit )] 1 - 0 + [仮数部 ( 23 bit )] IEEE 754 の仮数部は、正規化されている => M が、 1 <= M < 2 となっている !! => 2 進数にすると最上位の Bit は常に 1 になる => したがって、記録する必要はない ( 吝表現 !! ) # 二進法特有のテクニック !! ## 他の進数ではこの方法が利用できない # IEEE は、仮数部は 23 bit しかないが、吝表現なので、 # 実質 24 bit 分の精度をもっている ( 4% 程の得 !! )。 ## 4% といえ侮るなかれ、銀行預金より十分に高い !! # 吝表現を考えたのは、Kahan という人 ## 最初に、IEEE 754 を実装されたのは、Intel 8087 (co-processer) から ## => それまでは、実数は、ソフトウェアで行っていた ## 8086 は整数まで、8087 を付けると実数計算が可能に.. [指数部 ( 8 bit )] # 比較の時に、整数と同じ形になるように対応関係を工夫する.. 対応 表現された数 表現するビットパターン 2^(-128) => 00000000 2^(-127) => 00000001 .. 2^(- 1) => 01111111 2^( 0) => 10000000 2^( 1) => 10000001 .. 2^( 128) => 11111111 # この対応だと、表現された数の大小関係と、表現するビッ # トパターンを符号無し整数とみたときに大小関係が一致す # る ## これを考えた人は楽しかっただろうね... ### 考えた人は、色々考えたに違いない ### ( 教わる人の 100 倍は知識が必要.. ) #### 数年後に、誉められるか、貶されるか.. ? 下駄ばき表現 : 指数の値に、2^7 を加えた ( 下駄をはかせ た.. ) 数になっている 64 bit の場合は 指数部 12 bit 10^300 位 仮数部 51 bit # 仮数部だけでなく指数部も長くなっている # 精度は、倍より長くなっている !! [注意] 単精度では a = 10^30, b = 10^30 で、a*b は、10^60 なのでオーバフロー => 倍精度では、問題ない しかし... IEEE では、倍精度の数を単精度に移し たときにもオーバフローが起きる => IEEE 以前は、指数部の長さは変化しなかった オーバーフローは計算の時だけ生じる 単精度は十分か ? 10^38 は、普通には問題ないが.. 半導体の世界で 5V を扱おうとすると 10^100 位な ので、単純精度では少い == 実数の表現形式、色々 IEEE IBM 360 16 進数 ( 指数部の底が 2 でなく 16 ) IBM 7090 COBOL (お金の計算) が中心なので、内部的に 10 進数で計算 CRAY CDC UNIVAC バローズ 8 進数 GE 400 # 他にもある == 整数は、2 の補数表現 実数は、指数部を、下駄ばき表現、仮数部を吝表現にしている # ちょっと、変 => 数の比較を整数に揃えるため