演算誤差の原因を見つけることは非常に困難です。手掛かりは、途中までは何事もなかった演算結果が突然発散したり、有効数字を極端に失ったりした場合は、演算誤差を疑いましょう。
ログから演算結果を追いましょう。変数の値が「Inf」や0に戻る場合は、オーバーフローを疑い、「NaN」となる場合は、ゼロ除算の可能性があります。また、環境によっては動作が停止するため、参考にしてください。
実行結果が正しく出ず、計算ロジックが間違っているかもしれないと考えた場合は、「式が正しいか」「符号ミスをしていないか」「演算順序が正しいか」などの演算ルールに着目しましょう。
演算誤差は、事前に対策を立てることが難しいと思いますが、以下に気を付けましょう。
仕様や設計の段階で、おおよその最大値・最小値が分かるはずです。その情報から、オーバーフローを起こしそうな演算処理があるか確認しましょう。また、時間があれば、最大値・最小値を入れるテストを行ってください。
計算式に除算がある場合、ゼロ除算を回避する条件式を追加しましょう。また、静的解析ツールなどを活用し、問題がないか確認することも大事です。
まずは、仕様の数式を読み解き、意図を確認しましょう。これが意外に難しく、演算ルールを理解する必要があります。分からない場合は、仕様定義者に意図を確認しましょう。
今回は、四則演算に関するバグ(演算誤差、オーバーフロー、演算ルール)を取り上げました。
今回は、四則演算に関するバグを取り上げました。四則演算はプログラミングの基本ですが、意外と発生するバグだと筆者は感じています。特に、オーバーフローやゼロ除算は、クリティカルなバグとなります。気を付けましょう。
また、オーバーフローやゼロ除算は、前シリーズのバグ検出ドリルや書籍版バグ検出ドリルにも問題として登場します。興味がある方は、目を通していただければと思います。
[1]コンピュータのしくみがよくわかる!C言語プログラミングなるほど実験室(矢沢久雄、2015年、技術評論社)
[2]すべてわかるIoT大全2017(吉田琢也、2017年、日経BP)
[3]数値計算の常識(伊理正夫、藤野和建、1985年、共立出版)
山浦恒央先生が執筆した書籍「ソフトウェア技術者のためのバグ検出ドリル」が日科技連出版から発売中です。本連載「山浦恒央の“くみこみ”な話」とTechFactoryの連載「組み込みエンジニアの現場力養成演習ドリル」をベースに、大幅加筆、改訂した内容になっています。
内容は、「デバッグの詰将棋」で、要求仕様定義、設計、コーディング、テスト、保守の5フェーズでの「バグを埋め込んだ仕様記述やソースコード」を読んで、バグをピンポイントで見つける問題集になっています。全部で31問あり、難易度は初級から上級まで、いろいろです。興味のある方は、Amazon.comや書店でチェックしてください!
東海大学 大学院 組込み技術研究科 非常勤講師(工学博士)
Copyright © ITmedia, Inc. All Rights Reserved.