連載
» 2020年01月14日 11時00分 公開

山浦恒央の“くみこみ”な話(125):ソフトウェア技術者のためのバグ百科事典(4)Excelがバグの原因に!? (2/3)

[山浦恒央 東海大学 大学院 組込み技術研究科 非常勤講師(工学博士),MONOist]

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 リスト2 設定するデータ(Excel画面のキャプチャー)

 リスト1は、円の面積を求めるプログラムで、リスト2はプログラムにハードコードするデータです。筆者は以下の順番でデータをプログラムに入力しました。

  1. リスト1に示したプログラムを作成した。ただし、この時は半径(radius)と円周率(pi)には、仮の値を設定している
  2. 別のエンジニアからradiusとpiの設定値が入ったExcelファイルをもらい、リスト2を作成した
  3. リスト2からリスト1のradiusとpiの値をハードコードするため、プログラムに対し、「Ctrl + c」でコピーし、「Ctrl + v」でリスト1にペーストした
  4. プログラムをコンパイル、実行し、結果とリスト2に示した面積の値を比較した
  5. 比較すると、結果が「28.260000」となり、リスト2の「28.274319」と一致しないことが分かった。「printf("%f……)」の小数点以下のデフォルトの桁数は6桁となっているため、「28.260000」の下4桁は無視して考えてください。

5.原因はExcelの仕様だった

 面積の計算結果が不一致の原因は、Excelにありました。リスト2の画像の最上部にある細かい数字をよく確認すると、「3.141591」となっていることが分かるでしょう(リスト2を拡大して再掲)。これが、C3のセルの実際の値です。

リスト2 リスト2 設定するデータ(Excel画面のキャプチャー)を再掲(クリックで拡大)

 セルのC3を見ると、「3.14E+00」となっています。これは、セルの書式設定が指数形式で小数点以下の桁数が2桁になっているためです(画面1)。

画面1 画面1 リスト2のC3のセルの書式設定

 筆者は、リスト2のセルからコピーしたので、値は間違えていないと思い込んだのですが、指数形式でコピーをすると、テキストエディタには、表示桁数のみをコピーする仕様となっています。よって、表示桁以下の値が間違っていることに気づきませんでした。実際に確認してみましょう(リスト3)。

リスト3 リスト3 確認結果(左:Excel、右:テキストエディタへのコピー結果)

 リスト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.