ソフトウェア技術者のためのバグ百科事典(4)Excelがバグの原因に!?:山浦恒央の“くみこみ”な話(125)(2/3 ページ)
ソフトウェア技術者に向けて、バグに関する基礎知識をまとめていく新シリーズ「バグ百科事典」。第4回は、前回に続き「データ入力ミスのバグ」について解説します。Excelのように日頃使う開発ツールもバグの原因になり得るのです。
4.筆者がやってしまったデータ設定のバグ
筆者が過去にやってしまったバグを基に作成したデータ設定のバグの例を示します(リスト1、リスト2)。
/* 円の面積を求めるプログラム CircleArea.c */ #include <stdio.h> int main(void) { //各変数の宣言 float radius = 3; //半径 float pi = 3.14E+00; //円周率 float CircleArea = 0.0; //円の面積 //円の面積を算出する(半径*半径*π) CircleArea = radius * radius * pi; //円の面積 //結果を表示する printf("円の面積 = %f", CircleArea); return 0; }
リスト1は、円の面積を求めるプログラムで、リスト2はプログラムにハードコードするデータです。筆者は以下の順番でデータをプログラムに入力しました。
- リスト1に示したプログラムを作成した。ただし、この時は半径(radius)と円周率(pi)には、仮の値を設定している
- 別のエンジニアからradiusとpiの設定値が入ったExcelファイルをもらい、リスト2を作成した
- リスト2からリスト1のradiusとpiの値をハードコードするため、プログラムに対し、「Ctrl + c」でコピーし、「Ctrl + v」でリスト1にペーストした
- プログラムをコンパイル、実行し、結果とリスト2に示した面積の値を比較した
- 比較すると、結果が「28.260000」となり、リスト2の「28.274319」と一致しないことが分かった。「printf("%f……)」の小数点以下のデフォルトの桁数は6桁となっているため、「28.260000」の下4桁は無視して考えてください。
5.原因はExcelの仕様だった
面積の計算結果が不一致の原因は、Excelにありました。リスト2の画像の最上部にある細かい数字をよく確認すると、「3.141591」となっていることが分かるでしょう(リスト2を拡大して再掲)。これが、C3のセルの実際の値です。
セルのC3を見ると、「3.14E+00」となっています。これは、セルの書式設定が指数形式で小数点以下の桁数が2桁になっているためです(画面1)。
筆者は、リスト2のセルからコピーしたので、値は間違えていないと思い込んだのですが、指数形式でコピーをすると、テキストエディタには、表示桁数のみをコピーする仕様となっています。よって、表示桁以下の値が間違っていることに気づきませんでした。実際に確認してみましょう(リスト3)。
リスト3は、Excelのセルからテキストエディタへコピーした時の結果を示したものです。1、2行目はともに「3.141591」を入力しています。ただし、1行目のセルの書式設定は指数で小数点以下の桁数は2桁にし、2行目は標準の状態です。
1行目をコピーすると、「3.141591」ではなく「3.14E+00」となりました。2行目は「3.141591」がそのまま貼り付けられました。つまり、Excelの指数表記をコピーすると、セルの内部の値ではなく画面の最上段の値をコピーします。結果として、本来「3.141591」で計算するところを3.14として計算し、結果が一致しなくなりました。正しくは、セル書式を標準とするか、桁数を変えてからコピーするべきでした。
Copyright © ITmedia, Inc. All Rights Reserved.