バグ検出ドリル(2)理系なのにプログラマーは苦手!? 数学の問題:山浦恒央の“くみこみ”な話(102)(2/3 ページ)
「バグ検出ドリル」の第2回で出題するのは数学に関係する問題。理系なので数学が得意と思われがちなプログラマーですが、実はそれほどでもなかったりするのだとか……。数学的な技術を身に付けて、よりレベルの高いエンジニアを目指そう!
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; }
問題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から、atan2はx、yの値を与えると、その座標とx軸が作る角度を算出するものと分かった(図1.2)。例えば、atan2が30度となるのは、x=√3(1.732051)でy=1の時である。45度になるのは、x=1でy=1の時である。60度になる時は、x=1、y=√3の時である。
感触がつかめたので、入力した通りに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
atan2(√3, 1.0) = 60.000000 atan2(1.0, 1.0) = 45.000000 atan2(1.0, √3) = 30.000000
Copyright © ITmedia, Inc. All Rights Reserved.