MNAの世界

ブログをリニューアルしました!コメント、リンク、ツイートなどはお気軽にどうぞ。

C/C++

浮動小数点のワナ

投稿日:2009年8月26日 更新日:

ただいま絶賛滋賀で作業中です。
片道2時間です。若干キレ気味です。
さて、今回もマージなんぞを任されたわけですが、俺としたことが珍しくトラブってました。

その原因は浮動小数点。
機能の追加によってとある構造体にメンバが追加されたりした場合、これまでのデータと互換性を保つためにバージョン情報によって読むメンバを決定しています。
この部分、今までは0.5刻みでバージョンをつけていたようなのですが、今回はなぜか0.1刻みでバージョン値を変更して欲しいとの指示がありました。
0.5は2進数で正確に表現できますが、0.1単位となると2進数では正確に表現できません。
しかも、元のソースを見るとdoubleとfloatの比較をしてやがります。
当然桁丸め誤差が出るため、バージョン比較判定でバグります。

これにはやられました。
今までは0.5刻みだからたまたまバグが発覚しなかっただけ、俺はハズレくじ第1号になってしまったようです。
確かに、「バージョン番号に小数点なんて気持ち悪いなぁ・・・」とか「こういうのは普通 LOW WORD を小数部分に、HIGH WORD を整数部分にしたりするだろ・・・」とか「floatとの比較なら明示的にfつけろよ・・・(直に小数だけを書くと const double になります)」とか思いながら移植してましたが、「そういう間抜けな部分も忠実に移植する!!!」というこれまでの手法を貫いたのが裏目に出たようです。
(どうしてこうなった!?と問いただすと、担当曰く「こういうことを知ってる人があまりいないんですよ~」らしい。)

実機でのデバッグが難しい&内部の動きなんぞ知らないこともあり、しょーもないことで2日も潰れたよ・・・orz
はうぅ。

-C/C++


comment

リンクが多数含まれていると表示されないのでご注意ください。(スパム対策)

関連記事

no image

[C++]非staticなメンバ関数をコールバックで呼ぶ方法

!!!注意!!! これは思いついたことを試しにやってみたらそれっぽく動いたというお話です。 今はstd::functionとstd::bindが標準搭載されていますのでそちらを使いましょう。 現在、G… 続きを読む

no image

PNGに対応

ついに新フレームワークでの動作を開始したZen-Ichiですが、フルカラー化&高解像度化の影響でロード時間がとてつもなく長くなってしまいました。 これではネオジオCDになってしまいます。 (ちなみに当… 続きを読む

no image

[C++]GetKeyboardState() と DirectInput

会社での待機時間を利用して新フレームワークの製作をちょくちょく進めています。 以前思いついたメンバ関数のコールバック機構を発展させて、イベント通知ギミックを完成させたので、次は入力系統のクラス作成にと… 続きを読む