2007.07.14
  • twitter
  • facebook
  • はてなブックマーク
  • 印刷

誤差と補正と

株式会社オーグメント 代表取締役 渡辺 俊雄

すみません。本題に入る前に少々宣伝をさせてください。/(^^;

ITmedia というサイトで、セキュリティに関する記事を書きました。最近では、学校においても情報流出などの事故が起こり、その対策が求められています。この特集では、会社に入った新人を想定し、さまざまな問題に対してどのように考えるべきかが特集されています。山賀氏の連載と合わせて、ぜひご一読ください。

■研修で教えてくれない!:
概論編「なぜセキュリティ対策する必要があるのか」を再考する
http://www.itmedia.co.jp/bizid/articles/0707/11/news046.html

第1回「メールを転送しちゃダメ?」
http://www.itmedia.co.jp/bizid/articles/0706/15/news005.html
第2回「HTMLメールはなぜダメなのか」
http://www.itmedia.co.jp/bizid/articles/0706/20/news036.html
第3回「自動返信メールが“危険”な理由」
http://www.itmedia.co.jp/bizid/articles/0706/26/news008.html
第4回「セキュリティポリシーは何のため?」
http://www.itmedia.co.jp/bizid/articles/0707/02/news028.html
第5回「使いたいソフトを勝手にインストールしてはダメ?」
http://www.itmedia.co.jp/bizid/articles/0707/10/news063.html


さて、では本来の話に戻りましょう。前回は、コンピュータ上で2進数計算をする際に発生する“誤差”について説明しました。この問題は、言い方を変えると「2進数で起こる誤差を考慮せずに計算を進めると、10進数での計算では発生しなかった誤差が蓄積され、演算結果に異なる結果が出てくる可能性がある」というものです。

こうした問題は、たとえばお金を扱う場合などでは深刻になりますよね。利用する側から見れば、「誤差が出るのは当たり前」と言われても、だからといってそれを簡単に受け入れることはできません。

そこで考えられたのが、10進数をそのまま計算できるようにするBCD(Binary-coded decimalの略、二進化十進数)などの仕組みです。具体的な仕組みの話はここではしませんが、BCDという仕組みを使うと先に示したような誤差の問題を回避することができるようになります(0.1という数字は、そのまま0.1として扱えるため)。欠点としては、コンピュータ内部での演算が複雑になり、処理が遅くなってしまうこと、扱える桁数が小さくなってしまうことなどが挙げられます。

では、代表的な表計算ソフトウェアであるエクセルではどのように処理しているのでしょうか。実は、2進数のまま計算し、内部で“補正”しています。先ほど説明したBCDといった方式を使わないのは、(あくまで推測ですが)処理速度や扱える数値の制約などが理由なのかもしれません。

[XL2003] 小数を使用した計算の誤差について
http://support.microsoft.com/kb/813530/ja

さて、ここで重要なのは、補正というのは、ある意味“辻褄合わせ”であるという点です。誤差が出ることがわかっているから、それを前提に調整をする。その結果は概ね正しいものではありますが、常に正しいというわけではありません。マイクロソフト社のページには、次のような資料も掲載されています。

Excel で浮動小数点演算の結果が正しくない場合がある
http://support.microsoft.com/kb/78113/JA/
[XL97] 特定の小数部を持つ数値を入力した場合に誤差を生じる
http://support.microsoft.com/kb/161234/JA/

ここには、非常に大きな数値や小さな数値を使った際の事例や、ある特定のケースで起こる問題、精度の誤差を修正する方法の提案などが書かれています。たとえば、ある例を引用してみましょう。

----- 引用、ここから -------
負数の和を求める例

1. 新しいブックに次のように入力します。
   A1: =(43.1-43.2)+1

2. セル A1 を右クリックし、[セルの書式設定] をクリックします。[表示形式] タブの [分類] で [指数] をクリックします。[小数点以下の桁数] を 15 に設定します。

0.9 ではなく 0.899999999999999 と表示されます。(43.1-43.2) が先に計算され、-0.1 が一時的に格納されるため、その格納に伴う誤差が計算に影響を及ぼしています。
----- 引用、ここまで -------

内容的には書かれたとおりですが、桁の大きいほう、小数点第一位だけを見れば9と8という差が出てしまいますよね。^^;

次回は、誤差にどう向き合うかという話をしたいと思います。

渡辺 俊雄(わたなべ としお)

株式会社オーグメント 代表取締役
1958年、東京生まれ。メーカー系システムエンジニア、大手コンピュータ出版社の書籍編集者、インターネット関連組織の広報などを経て2006年に独立。大学生と高校生の二人の子どもを持つ。

ご意見・ご要望、お待ちしています!

この記事に対する皆様のご意見、ご要望をお寄せください。今後の記事制作の参考にさせていただきます。(なお個別・個人的なご質問・ご相談等に関してはお受けいたしかねます。)

pagetop