- 締切済み
現在、情報処理試験の勉強をしているのですが、
現在、情報処理試験の勉強をしているのですが、 桁落ち誤差がなぜ誤差なのかが分かりません。 有効数字(有効桁数)が減少する事の何が問題なのか、 正規化されて仮数部には0が入るだけで、 0なんだから、 誤差(誤った差)なんて無いように思えるのですが。。 複数のサイトを見てみましたが、 まとめると以下の3つのパターンの解説に大別できるように思われます。 (1)有効桁数が減少する事を桁落ち誤差と言う ⇒桁落ちによりどのような誤差が発生するのか解説がなく。 (2)正規化された部分に0以外が入ることがある。(プログラミング) http://www.k-cube.co.jp/wakaba/server/numerical_problem.html ⇒正規化された部分には0が入るという前提があるので、 このサイトの桁落ちと 情報処理試験の桁落ちは前提が違う。 (3)科学技術計算では2と2.000は違うので、 桁落ちは問題 http://itpro.nikkeibp.co.jp/members/ITPro/ITBASIC/20010719/5/ ⇒だいぶ探している答えに近い気はするが、 具体例がなく良く分からず。。 具体的な例で何が問題なのかを、 どうして誤差が発生するのか、 ご教授頂ければ幸いです。。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- jjon-com
- ベストアンサー率61% (1599/2592)
http://ja.wikipedia.org/wiki/誤差 の「2.4 桁落ち」で例示されている √1001 - √999 で説明します。 (計算機内部は本当なら仮数も基数も2進数ですが,メンドウなので以下,10進数の浮動小数点数形式を用います) √1001 は 31.63858403911275… と続く無限小数です。 「0.仮数 × 10の指数」という形式で表現するなら, 「0.3163858403911275… × 10の2乗」です。 √999 は 31.60696125855821… と続く無限小数です。 こちらは「0.3160696125855821… × 10の2乗」です。 -------- 次に,仮数部の長さが8桁(有効数字が8桁)の浮動小数点数形式の変数を用いて, √1001 - √999 を計算してみます。 0.31638584 × 10の2乗(=√1001) - 0.31606961 × 10の2乗(=√999 ) ――――――――――――――――― 0.00031623 × 10の2乗 ↓仮数の正規化 0.31623000 × 10の-1乗 ■結果その1■ さて。 √1001 の仮数は本来 0.31638584 だったのでしょうか? 違います。精度が8桁だからそれ以降を仕方なく丸めただけで,本来は 0.31638584[03911275…] と小数部が続く数でした。√999 も同じ。 したがって,計算途中の精度を維持できていれば,計算結果は次のようになります。 0.31638584[03911275…] × 10の2乗(=√1001) - 0.31606961[25855821…] × 10の2乗(=√999 ) ――――――――――――――――― 0.00031622[78055454…] × 10の2乗 ↓仮数の正規化 0.31622[78055454…] × 10の-1乗 ↓精度8桁に丸める 0.31622780 × 10の-1乗 ■結果その2■ -------- 結論です。 最終的に計算結果を格納する変数が,仮数の長さ8桁という同じ形式の浮動小数点数であっても, ほぼ等しい数同士の減算をおこなえば, 0.31623000 × 10の-1乗 ■結果その1■ のように,仮数の正規化による左3桁シフトにより末尾に無意味な0が3つ並んだ,すなわち有効けた数が実質5桁しかない「けた落ち誤差」を含んだ値になります。 反対に,計算途中における仮数長を十分長く確保していたり,計算の工夫によってほぼ等しい数同士の減算をおこなわないようにすれば(前述のja.wikipediaを参照), 0.31622780 × 10の-1乗 ■結果その2■ のように,8桁の有効けた幅をいっぱいに活かした結果を求めることができます。 (ちなみに 0.31622780 の末尾の0は無意味な0ではなく,計算の結果求められた精度としての意味を持つ0です,念のため)
- ymmasayan
- ベストアンサー率30% (2593/8599)
桁落ちはまず例を1つ理解してから理解・検討を発展させるのがいいでしょう。 有効桁数6桁の計算機を考えます。 A=10003/7-10002/7を計算すると A=1429-1428.8571428571・・・・・・ =1429.00-1428.86=0.14(コンピュータ出力) 正規には0.14285714286・・・ 1/7=0.142857(コンピュータ出力) 有効数字が2桁と6桁と大きく差が出ます。 なぜかは別にして計算順序を変えるだけで簡単に桁落ちが起こってしまうのです。 コンピュータは有限桁数なので、計算順序を考えなさいよと言う啓蒙が 桁落ちや情報落ちです。 理屈はあとからついてきたのです。