[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 メーリングリストの案内