kazu22002の技術覚書

PHPer, Golang, AWS エンジニアの日々

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ドキュメントです。

PHP: 整数 - Manual

PHP: 浮動小数点数 - Manual