[PHP-users 31527] Re: strvalの仕様
Kenji Abe
kenji.ml @ gmail.com
2007年 2月 22日 (木) 16:04:45 JST
安部です。
まず、前回の投稿時にマニュアルをよく読んでいなかったため
訂正させてください。
http://jp2.php.net/manual/ja/function.gettype.php
gettype() を使用して型を調べないでください、とありますね。
float型の場合はdoubleが返される、ともあります。
ですので
> echo gettype(1234567890000);
> // double
ではなく
var_dump(1234567890000);
// float(1234567890000)
にするのがよさそうです。
> 巨大整数が、
> 1)どこで、どういった定義域で浮動小数(float?double?)にパースされるのか
> 2)strval 関数の定義域(または制約条件)はどこまでなのか
> (引数はmixedなので浮動小数で表現された整数もパース出来ると信じてい
> るのですが)
> の2点が知りたいことです。
1) については、PHP_INT_MAX まではint、それより大きいとfloatとして
パースされるのではないでしょうか。
32bitCPUの場合は、符号付4バイトだとして 0x7fffffff = 2147483647 が
一般的かと思います。
以下、例はこちらの環境でのものです。
echo PHP_INT_MAX;
// 2147483647
var_dump(2147483647);
// int(2147483647)
var_dump(2147483648);
// float(2147483648)
2)についてはパースというよりも、floatを文字列に変換する際に
どのような表記に変換されるか、ということですよね。
これは飯塚さんが書かれたように、 precision 設定によって
指数表記になる桁数が変わるようです。
但し、浮動小数というものは内部表現の問題で誤差の問題がつきものです。
一般的な 32bitCPU での精度は14桁程度のようですし、場合によっては
小さい値でも誤差が発生します。
http://jp2.php.net/manual/ja/language.types.float.php
ini_set('precision', 16);
echo 12345678901234567;
// 1.234567890123457E+16
ini_set('precision', 17);
echo 12345678901234567;
// 12345678901234568
大きい整数を扱う必要があるのであれば、GMP関数を使われたほうが
よいかもしれません。
PHP-users メーリングリストの案内