|
- 396 :牛の骨 ◆Y.sCOWwwCM sage :03/04/09 23:43 ID:mvDMRy2v
- [1/18]
(今日はコンピュータの数値計算のお話) ━O━━━━━━━━━━━━━━━━━━━━━━━━━━ o コンピュータにおける実数の扱いには次の2種類があります 。 ・ 整数 ,__ ・ 浮動小数点 iii■∧ / ━ < ゚ _・゚>/━━━━━━∧∧━━━━ ∧∧━━━━━━━━ | つ ∇ (゚Д゚,,) (゚Д゚,,) ノ).| |┌─┐ /⊂ ヽ /⊂ ヽ \| ||□| √ ̄(___ノ〜 √ ̄(___ノ〜 ∪∪ | | || ━┳┛ || ━┳┛  ̄ ̄ ̄ ̄| | ====∧========== / ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | 実数だから虚数は除いての話ですね。 \____ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ | ところで下の浮動小数点って何ですか? \_________________
- 397 :牛の骨 ◆Y.sCOWwwCM sage :03/04/09 23:44 ID:mvDMRy2v
- [2/18]
(ちゃんと説明するのでご心配なく) ━O━━━━━━━━━━━━━━━━━━━━━━━━━ o 浮動小数点とは次の3要素からなる数のこと 。 ・ 正負の符号 . ・ 1以上基数未満の小数(仮数と呼ぶ) ,__ ・ 基数の累乗(指数と呼ぶ) iii■∧ / ※ 基数は10進数なら10, 2進数なら2, n進数ならn ━ < ゚ _・゚>/━━━━━━∧∧━━━━ ∧∧━━━━━━━ | つ ∇ (゚Д゚,,) (゚Д゚;) ノ).| |┌─┐ /⊂ ヽ /⊂ ヽ \| ||□| √ ̄(___ノ〜 √ ̄(___ノ〜 ∪∪ | | || ━┳┛ || ━┳┛  ̄ ̄ ̄ ̄| | ==========∧==== / ̄ ̄ ̄  ̄ ̄ ̄ ̄ | え?えーと……。 ∧ \ / ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | 具体例を挙げてもらえませんか。 \________________
- 398 :牛の骨 ◆Y.sCOWwwCM sage :03/04/09 23:44 ID:mvDMRy2v
- [3/18]
(具体的にはこうなります) ━O━━━━━━━━━━━━━━━━━━━━━━━━ o 例: 1.2345*10^-3 。 符号 正, 仮数 1.2345, 指数 -3 ,__ 注 浮動小数点の場合, 精度は仮数部の桁数で, iii■∧ / 表現可能な範囲は指数部の桁数で決まります。 ━ < ゚ _・゚>/━━━━━━∧∧━━━━ ∧∧━━━━━━ | つ ∇ (゚Д゚,,) (゚Д゚,,) ノ).| |┌─┐ /⊂ ヽ /⊂ ヽ \| ||□| √ ̄(___ノ〜 √ ̄(___ノ〜 ∪∪ | | || ━┳┛ || ━┳┛  ̄ ̄ ̄ ̄| | ====∧========== / ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | 1.2345E-3という表記で見たことあります。 \____ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ | Excelで言うところの指数表示か。 \_______________
- 399 :牛の骨 ◆Y.sCOWwwCM sage :03/04/09 23:45 ID:mvDMRy2v
- [4/18]
━━━━━━━━━━━━━━━━━━━━━━━━━━ 数学上は整数でも, 浮動小数点として扱うことができます。 表示が整数だから内部でも整数扱いとは限りません。 また, 整数を指数表示することもできます。 表示と実際の内部の取り扱いは別の話です。 ,__ iii■∧ / ━ < ゚ _・゚>/━━━━━━∧∧━━━━ ∧∧━━━━━━━ | つ ∇ (゚Д゚,,) (゚Д゚,,) ノ).| |┌─┐ /⊂ ヽ /⊂ ヽ \| ||□| √ ̄(___ノ〜 √ ̄(___ノ〜 ∪∪ | | || ━┳┛ || ━┳┛  ̄ ̄ ̄ ̄| | ====∧========== / ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | 表示が1200でも実は浮動小数点の1.20*10^3だったり \__ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | 整数の1200が1.20E03と表示されてたりするわけだ。 \______________________
- 400 :牛の骨 ◆Y.sCOWwwCM sage :03/04/09 23:46 ID:mvDMRy2v
- [5/18]
(整数の説明もしておきましょう) ━O━━━━━━━━━━━━━━━━━━━ o 整数 。 符号はある場合もない場合もある。 ,__ 桁数に応じた表現範囲を持つ。 iii■∧ / ━ < ゚ _・゚>/━━━━━━∧∧━━━━ ∧∧━ | つ ∇ (゚Д゚,,) (゚Д゚,,) ノ).| |┌─┐ /⊂ ヽ /⊂ ヽ \| ||□| √ ̄(___ノ〜 √ ̄(___ノ〜 ∪∪ | | || ━┳┛ || ━┳┛  ̄ ̄ ̄ ̄| | ====∧========== / ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | 3桁の整数なら-999〜999が表現範囲と。 \____ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ | 符号がなければ0〜999だけどね。 \_______________
- 401 :牛の骨 ◆Y.sCOWwwCM sage :03/04/09 23:47 ID:mvDMRy2v
- [6/18]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 整数と浮動小数点の違いのまとめ 整数 ・ 加減算, 乗算で誤差が生じない どのコンピュータでも同じ結果が得られる。 ・ 絶対値が極端に大きな数や小さな数は扱えない 表現範囲を越えるような極端に大きな整数は扱えない。 また, 小数を扱うことはできない。 ・ 大きな数字を扱う場合, その桁数だけメモリが必要となり効率が悪い 100桁の整数を保持するなら100桁分のメモリが必要。 ・ 大きな数字を扱う場合, その桁数だけ計算を行うので計算時間がかかる 100桁の数字なら100桁分の計算が常に必要となる。 浮動小数点 ・ 加減算, 乗算でも誤差を生じる ハードウェアの設計によっては結果が相互に異なる可能性もある。 ・ 絶対値が極端に大きな数も小さな数も扱える 100桁の整数を表現する場合でも指数部が99, つまり2桁まで表せれば十分。 また, 小数を扱うこともできる。 ・ 大きな数字でもメモリをあまり消費することなく数値を保持できる 指数部を2桁確保しておけば100桁の整数まで表せる。 ・ 大きな数字でも仮数部の桁数に応じた計算時間しかかからない 必要な精度に応じた仮数部を確保しておけば 精度に応じた計算時間しかかからない。 ,__ iii■∧ / ━ < ゚ _・゚>/━━━━━━∧∧━━━━ ∧∧━━━━━━━━━━━━━━━━ | つ ∇ (゚Д゚,,) (゚Д゚,,) ノ).| |┌─┐ /⊂ ヽ /⊂ ヽ \| ||□| √ ̄(___ノ〜 √ ̄(___ノ〜 ∪∪ | | || ━┳┛ || ━┳┛  ̄ ̄ ̄ ̄| | ====∧========== / ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ | まとめってもう終わりですか? \____ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ | (…それはそれでありがたいけど…) \________________
- 402 :牛の骨 ◆Y.sCOWwwCM sage :03/04/09 23:47 ID:mvDMRy2v
- [7/18]
(ご期待に添えず残念ですが) ━O━━━━━━━━━━━━━━━━━━━━━━━━━━━ o ここからが本題―浮動小数点演算の精度, 誤差について― 。 ・ 丸め誤差, 桁落ち誤差 ,__ ・ 浮動小数点演算の歴史的な話 iii■∧ / ━ < ゚ _・゚>/━━━━━━∧∧━━━━ ∧∧━━━━━━━━━ | つ ∇ (゚Д゚,,) (,,゚Д゚) ノ).| |┌─┐ /⊂ ヽ /⊂ ヽ \| ||□| √ ̄(___ノ〜 √ ̄(___ノ〜 ∪∪ | | || ━┳┛ || ━┳┛  ̄ ̄ ̄ ̄| | ====∧========== / ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ | (…前置きにしては長い話だ…) \____ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ | (…さすがに甘い考えだったか…) \_______________
- 403 :牛の骨 ◆Y.sCOWwwCM sage :03/04/09 23:48 ID:mvDMRy2v
- [8/18]
(早速本題です) ━O━━━━━━━━━━━━━━━━━━━━━━━ o 丸め誤差 o 数値の丸めによって生じる誤差で, 。 最下位の位が影響を受ける。 。 例: 2/3=6.6666667E-1 。 桁落ち誤差 . 加減算で絶対値の差が大きいときに . 小さいほうの数値が演算結果に反映されないこと . 例: 1.234E5(123450)+6.789E0(6.789)=1.234E5 ,__ iii■∧ / ━ < ゚ _・゚>/━━━━━━∧∧━━━━ ∧∧━━━━━ | つ ∇ (゚Д゚,,) (゚Д゚,,) ノ).| |┌─┐ /⊂ ヽ /⊂ ヽ \| ||□| √ ̄(___ノ〜 √ ̄(___ノ〜 ∪∪ | | || ━┳┛ || ━┳┛  ̄ ̄ ̄ ̄| | ====∧========== / ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ | まあ、これはしょうがないな。 \____ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ | 問題なら仮数の桁を増やすしかないね。 \_________________
- 404 :牛の骨 ◆Y.sCOWwwCM sage :03/04/09 23:49 ID:mvDMRy2v
- [9/18]
━━━━━━━━━━━━━━━━━━━━━━━━━ 浮動小数点計算の桁落ち誤差実例 ∞ Σ1/n n=1 本来なら∞になるはずだが実際には桁落ち誤差により ある程度の値で収束してしまう。 また, 加算順序を変えると結果が変わる。 1/1→1/2147483646の加算結果 単精度(32bit)浮動小数点変数 15.40368 倍精度(64bit)浮動小数点変数 22.0647782615552 1/2147483646→1/1の加算結果 単精度(32bit)浮動小数点変数 18.80792 倍精度(64bit)浮動小数点変数 22.0647782618524 なお特殊な数学ソフトを使うと 収束しないので計算できないと答えてくれます。 ,__ iii■∧ / ━ < ゚ _・゚>/━━━━━━∧∧━━━━ ∧∧━━━━━━ | つ ∇ (゚Д゚,,) (゚Д゚,,) ノ).| |┌─┐ /⊂ ヽ /⊂ ヽ \| ||□| √ ̄(___ノ〜 √ ̄(___ノ〜 ∪∪ | | || ━┳┛ || ━┳┛  ̄ ̄ ̄ ̄| | ====∧========== / ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | 倍精度で精度が目に見えてに向上してる。 \____ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ | 数学ソフトってMathematicaの類か。 \________________
- 405 :牛の骨 ◆Y.sCOWwwCM sage :03/04/09 23:49 ID:mvDMRy2v
- [10/18]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 歴史的な話―ガード桁― 例: 1.234E0+5.678E-3 (仮数4桁, 指数1桁) 指数を大きいほうに揃え計算すると 1.234E0+0.005E0=1.239E0 指数を揃える際に2桁増やし, 6桁で計算してから丸めると 1.23400E0+0.00567E0=1.23967E0=1.240E0 こちらのほうがより本来の結果に近い。 このように元の仮数の桁数より大きな桁数で計算を行うと精度が上がる。 この精度向上のため付加された桁をガード桁と呼ぶ。 昔はガード桁のないコンピュータもありました。 ,__ iii■∧ / ━ < ゚ _・゚>/━━━━━━∧∧━━━━ ∧∧━━━━━━━━━━━━━ | つ ∇ (゚Д゚,,) (゚Д゚,,) ノ).| |┌─┐ /⊂ ヽ /⊂ ヽ \| ||□| √ ̄(___ノ〜 √ ̄(___ノ〜 ∪∪ | | || ━┳┛ || ━┳┛  ̄ ̄ ̄ ̄| | ====∧========== / ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | 精度が上がるのに何故付けなかったんだ? \____ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ | 昔だから知らなかったんじゃないの? \________________
- 406 :牛の骨 ◆Y.sCOWwwCM sage :03/04/09 23:50 ID:mvDMRy2v
- [11/18]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 何故ガード桁のないコンピュータが存在したか? 計算時間は仮数部の桁数に応じて長くなります。 ガード桁がなければその分速く計算ができました。←重要 ただし, 結果は当然精度の低いものでした。 また, 乗算を行う場合, 仮数の下位の桁の数字の影響は小さいということで 元の仮数より小さな桁数で計算を行うものすらありました。 この場合, 1を掛けただけで仮数の下位の数字が落とされ 元の数字と違うものになります。 ,__ iii■∧ / ━ < ゚ _・゚>/━━━━━━∧∧━━━━ ∧∧━━━━━━━━━ | つ ∇ (゚Д゚;) (゚Д゚;) ノ).| |┌─┐ /⊂ ヽ /⊂ ヽ \| ||□| √ ̄(___ノ〜 √ ̄(___ノ〜 ∪∪ | | || ━┳┛ || ━┳┛  ̄ ̄ ̄ ̄| | ====∧========== / ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | 1掛けただけで元の数字と変わる……。 \____ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ | それはいくらなんでも問題だよな。 \_______________
- 407 :牛の骨 ◆Y.sCOWwwCM sage :03/04/09 23:50 ID:mvDMRy2v
- [12/18]
(また, こんな例も) ━O━━━━━━━━━━━━━━━━━━━━━━━━━ o あるコンピュータでは割り算を次のように行っていました。 。 理由は速度向上のためです。 ,__ x/y → x*(1/y) iii■∧ / ━ < ゚ _・゚>/━━━━━━∧∧━━━━ ∧∧━━━━━━━ | つ ∇ (゚Д゚,,) (゚Д゚,,) ノ).| |┌─┐ /⊂ ヽ /⊂ ヽ \| ||□| √ ̄(___ノ〜 √ ̄(___ノ〜 ∪∪ | | || ━┳┛ || ━┳┛  ̄ ̄ ̄ ̄| | ====∧========== / ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ | 一見何の問題もないですね。 \______ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ | でも問題が発生したと……。 \_____________
- 408 :牛の骨 ◆Y.sCOWwwCM sage :03/04/09 23:51 ID:mvDMRy2v
- [13/18]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 単精度浮動小数点変数の表現範囲は次のようになっています。 0, ±1.401298E-45 〜±3.402823E38 倍精度では次のようになります。 0, ±4.94065645841247E-324 〜±1.79769313486232E308 指数部が負のほうに偏っていることに注意。 先の計算のxとyが倍精度でx, yがともに 1.00000000000000E-320の場合, x/yとして計算すると1になります。 しかし, x*(1/y)として計算すると次のように 計算途中で倍精度の上限を越えてしまい計算できません。 1/y=1.00000000000000E320>1.79769313486232E308 かつてはこのように計算速度のために計算結果が犠牲にされていました。 ,__ iii■∧ / ━ < ゚ _・゚>/━━━━━━∧∧━━━━ ∧∧━━━━━━━━━━━━━ | つ ∇ (゚Д゚,,) (゚Д゚,,) ノ).| |┌─┐ /⊂ ヽ /⊂ ヽ \| ||□| √ ̄(___ノ〜 √ ̄(___ノ〜 ∪∪ | | || ━┳┛ || ━┳┛  ̄ ̄ ̄ ̄| | ====∧========== / ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ | 幸いにして今は昔の話か。 \_______ ∧ / ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ | と, なると現在は? \_________
- 409 :牛の骨 ◆Y.sCOWwwCM sage :03/04/09 23:51 ID:mvDMRy2v
- [14/18]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 現在ではIEEEが浮動小数点演算を規格化(IEEE754)しています。 これに沿ったコンピュータならまともな結果が得られます。 ,__ iii■∧ / ━ < ゚ _・゚>/━━━━━━∧∧━━━━ ∧∧━━━━━━━━━ | つ ∇ (゚Д゚,,) (゚Д゚,,) ノ).| |┌─┐ /⊂ ヽ /⊂ ヽ \| ||□| √ ̄(___ノ〜 √ ̄(___ノ〜 ∪∪ | | || ━┳┛ || ━┳┛  ̄ ̄ ̄ ̄| | ====∧========== / ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ | めでたし, めでたしですね。 \____ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ | IEEEって1394だけじゃないんだ……。 \________________
- 410 :牛の骨 ◆Y.sCOWwwCM sage :03/04/09 23:52 ID:mvDMRy2v
- 15/18]
━━━━━━━━━━━━━━ 今日の講義はここまで ,__ iii■∧ / ━ < ゚ _・゚>/━━━━━━∧∧━ ∧∧ | つ ∇ (゚Д゚,,) (゚Д゚,,) ノ).| |┌─┐ /⊂ ヽ /⊂ ヽ \| ||□| √ ̄(___ノ〜 √ ̄(___ノ〜 ∪∪ | | || ━┳┛ || ━┳┛  ̄ ̄ ̄ ̄| | =============== [16/18] (……) ━O━━━━━━━━━━━━ o 。 ,__ iii■∧ / ━ < ゚ _・゚>/━━━━━━∧∧━ ∧∧ | つ ∇ (゚Д゚,,) (゚Д゚,,) ノ).| |┌─┐ /⊂ ヽ /⊂ ヽ \| ||□| √ ̄(___ノ〜 √ ̄(___ノ〜 ∪∪ | | || ━┳┛ || ━┳┛  ̄ ̄ ̄ ̄| | ====∧========== / ̄ ̄ ̄  ̄ ̄ ̄ ̄ | ……。 \_____ ∧ / ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ | ……? \_________
- 411 :牛の骨 ◆Y.sCOWwwCM sage :03/04/09 23:52 ID:mvDMRy2v
- [17/18]
(……) ━O━━━━━━━━━━━━ o 。 ,__ iii■∧ / ━ <;゚ _・゚>/━━━━━━∧∧━ ∧∧ | つ ∇ (゚Д゚;) (゚Д゚;) ノ).| |┌─┐ /⊂ ヽ /⊂ ヽ \| ||□| √ ̄(___ノ〜 √ ̄(___ノ〜 ∪∪ | | || ━┳┛ || ━┳┛  ̄ ̄ ̄ ̄| | ====∧========== / ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | 無理に揚げ物で講義締めなくていいですよ。 \____ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | ここの教官達に合わせることないですから。 \__________________
- 412 :牛の骨 ◆Y.sCOWwwCM sage :03/04/09 23:53 ID:mvDMRy2v
- [18/18]
━━━━━━━━━━━━━━ そうします。 ━━━━━━━━━━━∧∧━ ∧∧ (,,゚Д゚) (゚Д゚,,) ┌─┐ ⊂ ヽ ⊂ ヽ |□| √ ̄(___ノ〜 √ ̄(___ノ〜 | | || ━┳┛ || ━┳┛  ̄ ̄ ̄ ̄. | | ====∧========== / ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | 揚げ物教官達との付き合いに苦労してそうだね。 \________ ∧ / ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ | ……苦労は俺達もだけどな。 \_____________
|
|