消費税8%問題とceil関数の罠1円が合わないのはなぜ?最近、消費税が8%に上がり、お買い物が楽しくなった今日この頃。気になる問題が僕を襲いました。なんとceil関数の罠にドップリはまり、2、3日、酒浸りになりました。調査開始まずPHPのceil関数をしらべてみたら、ext/standard/math.cでceil関数を呼んでいる、ceil関数はgentooですとglibcパッケージ(libm)に入っていますので、そちらを確認してみましょう。RETURN_FALSE;}</pre>ですね、これを元にceilを利用したサンプル関数を作ってみる実際はどんなことしてるんだglibcのコードをソースコードレベルで解析したいので、面倒ですがglibcをdebug版でコンパイルしなおす。emergeするだけなので楽勝ですが、出きるまでビールでも呑んでましょう。サンプルコードとgdbを利用して、libmのceil関数へブレークポイントを仕掛けて、実行してみる。一撃でやられちゃってよくわからないので(自分がSSEをよくわかってない...笑)、正確ではないのですが違う関数ceillで再度確認。SSE命令より余計な部分が多いのですが、何をやっているのかわかりやすいのでこちらで確認。x87の細かい使い方は専門の方へお願いするとして、数バイトstep実行させた後のST(0)の値、ここへ15000*1.08の計算結果が格納されている。いうことに内部的になっているため、frndintを実行した場合に1を加えた数値になります。実際の計算を終えた後の、浮動小数点レジスタの値はこの様な感じになってました。st(0)の値がしっかり16201になってますね。-139086320......まとめると通常の計算結果で端数が出ない浮動小数点の計算でも、機械の内部ではぴったり収まらないケースがあるということ。