phpの数値について考える
paizaをやっていると「大規模データでエラーとなりました。」をよくみる。
PHPでやっているが、大規模データでエラーってことは数値の判定とか?
詳細はわからないが、PHPでの数値の扱いってどうなってるのか気になりました。
PHPは型宣言をしません。
型がない分、CやJavaより導入が楽に感じます(困ることもあるますが。。。)
PHPでは数値についてどういう扱いをするか。
まず数値扱いはどういう条件でされているか
decimal : [1-9][0-9]* | 0
hexadecimal : 0[xX][0-9a-fA-F]+
octal : 0[0-7]+
binary : 0b[01]+
integer : [+-]?decimal
| [+-]?hexadecimal
| [+-]?octal
| [+-]?binary
整数リテラルはイメージどおり。
数値の範囲の書き方なら数値として扱うっぽいですね。
では、intの限界値を超えた場合はどういう扱いをされているか。
結論としてはPHPが自動で認識してfloatで解釈をしてくれるそうです。
整数のオーバーフロー
integer型の範囲外の数を指定した場合、かわりに floatとして解釈されます。
また、結果が integer型の範囲外の数となるような計算を行うと floatが代わりに返されます。
32bitと64bitで範囲が変わりますが、対応されているようです。
ちなみにfloatも浮動少数点数の精度の話もあるっぽい
floatも浮動少数点数の精度が有限です。・・・
より高い精度が必要な場合には、任意精度数学関数またはgmp関数を代わりに使用してください。
参考はPHPドキュメントです。