ただいま絶賛滋賀で作業中です。
片道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
はうぅ。