はじめMath! Javaでコンピュータ数学

第10回 引き算はコンピュータの弱点[前編]

この記事を読むのに必要な時間:およそ 2 分

コンピュータで実数を表現するために工夫された浮動小数点数は,仮数部分をで近似する方法です。

取り扱える数の範囲や精度は,指数部と仮数部の桁数によって決まります。このしくみは自由に伸び縮みさせることができる伸縮性の物差しに例えることができます。大変便利なのですが,コンピュータの物差しは目盛りに無い数値は取り扱うことができません。数値が目盛りと目盛りの間に存在する場合は,何らかの約束事に従って,どちらかの目盛りを読み取ります。このようにして読み取った値は近似値といい,真の値との間に誤差があります。

コンピュータで計算を行う人は,このことをよく知っておきましょう。コンピュータは万能ではありません。大変便利な機械ですが,より大きな利便を得るためにちょっとした妥協をしています。時によってはこの妥協が大きな計算違いを生むことがあるのです。プロとしてコンピュータを用いるならば,この妥協による誤差がどんなもので,どの程度の誤差を発生するのかを必要とあらば把握できなければなりません。

コンピュータの数値の取り扱い方法のしくみを知り,誤差を把握することは,ちょうど大工さんが自分の道具に精通するのと似ています。

これから数回にわたって,コンピュータで実数値を取り扱うときに生じるエラーや誤差について学びます。将来本格的な数値計算を行う場合に役立つ知識です。コンピュータで数学的な問題を取り扱うことに興味を持たれている読者の皆さんは,このチャンスに浮動小数点数の弱点をしっかりと知りましょう。

図10.1 名人は道具をきわめる

図10.1 名人は道具をきわめる

浮動小数点数で発生するエラーや誤差

浮動小数点数の仕組み上,避けられないエラーや誤差には以下に挙げるものがあります。

  • オーバーフロー/アンダーフロー
  • 桁落ち
  • 丸め誤差
  • 情報欠落
  • 打ち切り誤差

今回はこれらのうち「オーバーフロー/アンダーフロー」「桁落ち」を学習しましょう。

オーバーフロー/アンダーフロー

オーバーフロー/アンダーフローとは,算術演算の結果,絶対値が表現可能な範囲を超えることを意味します。

オーバーフローが発生すると,Java言語の実数型では無限大(Infinity)と表現されます。アンダーフローが発生すると,Java言語の実数型では0として取り扱います。Java言語ではどちらの場合もエラーとしては取り扱いません。

具体的にはIEEE754単精度(float型)の場合※1),指数部が最大値の254を超えた場合がオーバーフローになります。float型は指数部255,符号部,仮数部ともに0で正の無限大を表します。符号部が1の場合は負の無限大です。指数部が最小値の0を下回る場合はアンダーフローです。その実数型の値は単に0になります。

オーバーフローもアンダーフローも,真の値は無限大やゼロではないにもかかわらず計算に支障が出る状況です。ものの寸法や個数などを扱う場合に,float型やdouble型の最大値は十分大きいように思われますが,各種計算式の途中で大変大きな数を生じる関数を用いている場合などはオーバーフローに注意が必要です。大きな数値の逆数が生じる場合も,その値がアンダーフローするとゼロ扱いになってしまいます。科学技術計算を行うプログラムを書く場合には,当然のことですが想定できる範囲のテストデータを用いて,計算途中の値をチェックしましょう。

※1
整数値計算のオーバーフロー/アンダーフローは考え方が異なります。例えばJava言語のbyte整数型なら,オーバーフローは127を超えた場合です。アンダーフローは-128を下回った場合です。

著者プロフィール

平田敦(ひらたあつし)

地方都市の公立工業高等学校教諭。趣味はプログラミングと日本の端っこ踏破旅行。2010年のLotYはRuby。結城浩氏のような仕事をしたいと妄想する30代後半♂。

コメント

コメントの記入