連載
» 2018年01月17日 10時00分 公開

バグ検出ドリル(2)理系なのにプログラマーは苦手!? 数学の問題山浦恒央の“くみこみ”な話(102)(2/3 ページ)

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

3.今回の問題

 今回は、エンジニアの考えと、プログラムの計算結果が一致しない場合を取り上げます(よくあることですね。筆者は、先輩から「プログラムは、考えた通りではなく、作った通りに動くんだ」とよく言われました。本当にその通りです)。問題文に示した情報から、何が原因で正しくないか推測してください。なお、ソースコードの可読性や実行速度は考えないことにします。

問題1:cos算出プログラム(小手調べ)

新人エンジニアA君は、角度からcosの値をコンソールに表示するプログラムを作成した。cos60°は、0.5になるはずだが、−0.95なった。以下のプログラムを解析し、原因を推察せよ。

#include <stdio.h>
#include <math.h>
int main(void) {
	double deg = 60.0;
	double result = 0.0;
	result = cos(deg);
	printf("cos60°= %.2lf\n",result);
	return 0;
}
リスト1  cosの値を算出するプログラム

問題2:atan2の算出プログラム(少し難度がアップ。意外な落とし穴あり)

 新人エンジニアB君は、先輩から直角三角形x、yの長さからatan2を求めるプログラムを作成するよう依頼を受けた。B君は、「atanは、アークタンジェントの略称」と知っていたが、アークタンジェントが何かよく理解しておらず、また、「atan2」は一度も聞いたことがなかったため、プログラミングの前にExcelに値を入力して感触をつかもうと考えた。図1.1は、atan2をExcelで算出したもので、A列にx、B列にyを入力すると、C列にatan2の結果を出力する。なお、Excelでもatan2を実装しており、D列に算出式を示す。

図1.1 図1.1 atan2計算用のExcelシート

 図1.1から、atan2はx、yの値を与えると、その座標とx軸が作る角度を算出するものと分かった(図1.2)。例えば、atan2が30度となるのは、x=√3(1.732051)でy=1の時である。45度になるのは、x=1でy=1の時である。60度になる時は、x=1、y=√3の時である。

図1.2 図1.2 atan2イメージ図

 感触がつかめたので、入力した通りにC言語で下記のプログラムを作成した(リスト2-1)。その後「Visual Studio2010」でコンパイルし、コンソールに表示したところ、Excelで作成した値と一致しないことが分かった(リスト2-2)。作成したプログラムの結果がExcelの値と一致しない理由を考察せよ。ただし、図1.1、図1.2に示した3つのx、yを入力する場合だけを想定する。

#include <stdio.h>
#include <math.h>
#define PI 3.1415926535
main()
{
	printf("atan2(√3, 1.0) = %lf\n", atan2(sqrt(3.0),1.0) * 180 / PI);
	printf("atan2(1.0, 1.0) = %lf\n", atan2(1.0,1.0) * 180 / PI);
	printf("atan2(1.0, √3) = %lf\n", atan2(1.0,sqrt(3.0)) * 180
リスト2-1 atan2を求めるプログラム
atan2(√3, 1.0) = 60.000000
atan2(1.0, 1.0) = 45.000000
atan2(1.0, √3) = 30.000000
リスト2-2 リスト2-1の実行結果

Copyright © ITmedia, Inc. All Rights Reserved.