がるの健忘録

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

桁あふれに伴う仕様

んっと…えっと…あっと………。
http://www.php.net/manual/ja/language.types.integer.php

整数のサイズはプラットフォームに依存しますが、 約20億(32ビット符号付)が一般的な値です。 PHPは符号無し整数をサポートしていません。

これはまぁいいです。ただまぁ気になるのが「じゃぁunsigned long値を扱いたいときは?」とかなるのですが。
普通こういう場合桁あふれして、signedなら「値が一気に負になる」もんであり、それに関しては異論ないのですが。
PHP君さすがですもっとすごいです。

整数のオーバーフロー
integer型の範囲外の数を指定した場合、かわりに floatとして解釈されます。また、結果が integer型の範囲外の数となるような計算を行うと floatが代わりに返されます。

………一応念のため。floatって単語を調べてみましょう。

浮動小数点数
-中略-
floatの大きさはプラットフォーム依存です。ただし、通常はおよそ10 進数で14桁の精度があり、最大値は ~1.8e308 (これは 64ビット IEEE フォーマットです)となります。

…さぁ不吉な予感万歳です。浮動小数点ってあたりに。

浮動小数点数の精度
0.1や0.7のような 簡単な小数表現も若干精度を失うことなく内部的な2進表現に変 換することはできません。
-中略-
これは、いくつかの分数は有限の桁数の小数点表記で正確に表現できな いという事実に関係しています。
-中略-
よって、小数の最後の桁を信用してはいかませんし、小数が等しいとい う比較を行ってはいけません。

うんうんだよねぇ精度信用できなくなるよねぇ当たり前である技術者として常識である。


…無論「桁あふれさせるほうが悪い」のは事実なのですが。こーゆー「微妙な」ことをやってくれるので、場合によっては注意が必要ですっていうか値が信用できないfloatにずらしこむ仕様ってどうなんだろう?
っつか「IPアドレスを数値に変換したい」だけなのに ;;
頼むから、せめてunsigned longくらい使わせてくれ ;;


ああちなみに。本当にでっかい値を「まじめに」扱いたいなら、GMP関数を取り込むのがお勧め。ちとコンパイル必須ですが、普通に便利です。