0

私は BIGINT 値 (テーブルのキー) の PHP 表現を試しており、PHP が大きな数を文字列/浮動小数点値としてどのように処理するかをテストするために、小さなテストを書きました:

<?php
 echo "PHP_INT_MAX=".PHP_INT_MAX."\n"; 
 $x = "9223372036854775107";
 echo "Defining x as : 9223372036854775107\n";
 $y = floatval($x);
 echo "float of x: ".$y."\n";
 echo "float to string using strval: ".strval($y)."\n";
 echo "float to string using sprintf: ".sprintf( "%.0f", $y)."\n";
?>

だから私は出力に興味があります:

PHP_INT_MAX=9223372036854775807
Defining x as : 9223372036854775107
float of x: 9.2233720368548E+18
float to string using strval: 9.2233720368548E+18
float to string using sprintf: 9223372036854774784

では、なぜ一致しない値を取得しているのでしょうか? (php.ini ファイルの精度 = 14)

4

1 に答える 1

2

それはすべてfloat型に関するものです。PHP は、IEEE 754に共通の標準を使用します。

浮動小数点サイズは 64 です。64 では、システム整数サイズも 64 です。

ただし、小数点以下の精度が失われない浮動小数点数の最大値は 9007199254740991 です。これを超える数値は、浮動小数点数を格納する形式のため、精度が失われます。

2^52=4,503,599,627,370,496 と 2^53=9,007,199,254,740,992 の間では、表現可能な数値は正確に整数です。2^53 から 2^54 までの次の範囲では、すべてが 2 で乗算されるため、表現可能な数値は偶数になります。逆に、2^51 から 2^52 までの前の範囲では、間隔は 0.5 です。など

2^n から 2^n+1 までの範囲の数の分数としての間隔は 2^n−52 です。したがって、数値を最も近い表現可能な数値 (マシン イプシロン) に丸めるときの相対丸め誤差の最大値は 2^−53 です。

倍精度浮動小数点形式

于 2013-10-23T00:41:38.650 に答える