バグ検出ドリル(2)理系なのにプログラマーは苦手!? 数学の問題:山浦恒央の“くみこみ”な話(102)(3/3 ページ)
「バグ検出ドリル」の第2回で出題するのは数学に関係する問題。理系なので数学が得意と思われがちなプログラマーですが、実はそれほどでもなかったりするのだとか……。数学的な技術を身に付けて、よりレベルの高いエンジニアを目指そう!
4.解答
解答を以下に示します。
問題1(cos算出プログラム)の解答
これは、cos関数の引数に度数を入れてしまう初歩的なミスです。プログラミング入門者は、大体間違えます(筆者もよく間違えました)。cos関数を使う場合、ラジアン(度数×π/180)で入れないと、意図しない値になります。
問題2(atan2算出プログラム)の解答
これは昔、筆者が3日間悩んだバグです。atan2の値の変化を確かめようと、Excelで計算式を組んでatan2を算出し、結果が正しいことを確認してからC言語で作ったのですが、計算結果が合いません。
散々悩んだ末、atan2の引数をよく調べると、Excelのatan2と、C言語のatan2とでは、引数の順番が逆転しているのです。Excelのatan2(x,y)は、C言語ではatan2(y,x)となります。分かってしまえば単純なバグですが、一度、「atan2の引数は、ExcelもC言語も同じ」と思い込むと、なかなかそこから抜けられません。皆さんは分かったでしょうか。
それにしても、なぜ、Excelではatan2(x,y)で、C言語ではatan2(y,x)と入れ替わっているのでしょう。普通、数学では(x,y)と表記するのに、なぜC言語ではatan2(y,x)と書くのでしょうか。
筆者の推測ですが、atan2の歴史は、「高級プログラミング言語界の北京原人」である「FORTRAN」までさかのぼります。FORTRANでは、atan2(y,x)となっています。それを代々の高級プログラミング言語が継承したのでしょう。しかし、xとyを書き間違うプログラマーがあまりにも多かったので、後発のプログラミング言語であるExcelでは、あえて、atan2(x,y)に「改訂」したのではないでしょうか。詳しい経緯をご存じの方がいらっしゃいましたら、教えてください。
5.自己採点シート
今回の自己採点シートを下記に示します。
問題 | 内容 | 配点(点) |
---|---|---|
cosの算出プログラム | 引数の値の間違えに気づいた | 40 |
atan2算出プログラム | 引数の順番が異なっていることに気付いた | 60 |
その他 | その他の間違えに気づいた | +5×件数 |
リスト4 自己採点シート |
6.終わりに
プログラマーは、理工系に分類できますが、数学が得意なエンジニアはあまりいません。今回は、数学に関する問題を出しました。プログラミングの実装方法も大事ですが、数学的な技術を身に付けると、よりレベルの高いエンジニアになれます。
参考文献
[1]「ゲーム開発のための数学・物理学入門 初版」(Wendy Stahler、2005、ソフトバンククリエイティブ)
東海大学 大学院 組込み技術研究科 非常勤講師(工学博士)
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- ≫連載「山浦恒央の“くみこみ”な話」バックナンバー
- バグ検出ドリル(1)「さあ、バグを見つけよう」
記念すべき連載第100回を突破した「山浦恒央の“くみこみ”な話」。今回の第101回からは、新シリーズ「バグ検出ドリル」が始まります。山浦氏が出題する問題に取り組んで、バグを見つけ出す力を養おう! - 組み込みソフトがこの10年で変わったこと、変わらないこと
MONOist開設10周年に合わせて、MONOistで記事を執筆していただいている方々からの特別寄稿を掲載していきます。第1弾は、間もなく連載100回を迎える「“くみこみ”な話」を執筆していただいている山浦恒央氏の寄稿です。 - タダでソフト開発の生産性と品質を上げる方法(10):プログラムの実行速度を瞬時に測定する「gprof」
ついに連載第100回を迎えた「山浦恒央の“くみこみ”な話」。今回の「タダでソフト開発の生産性と品質を上げる方法」の第10回では、プログラムの実行速度を瞬時に測定する「gprof」を紹介します。 - タダでソフト開発の生産性と品質を上げる方法(9):メモリリークを一瞬で見つける「Valgrind」(その2)
「タダでソフト開発の生産性と品質を上げる方法」の第9回。前回紹介した「Valgrind」を用いた具体的なメモリリークの検出方法について解説します。 - タダでソフト開発の生産性と品質を上げる方法(8):メモリリークを一瞬で見つける「Valgrind」(その1)
「タダでソフト開発の生産性と品質を上げる方法」の第8回。今回は、ソフトウェアエンジニアを悩ませる常習的なバグ「メモリリーク」を簡単に検出できる「Valgrind」を紹介します。