3

これに到達した方法の詳細は省略しますが、要点は、以下のコードがPHP5.2x86とPHP5.3x86で異なる結果を生成することです。

<?php

$result = (((-1035721791 + -2004767255) ^ 3402727701) + 4148612726) ^ -759268493;
echo 'Platform: ' . php_uname(), PHP_EOL;
echo 'PHP version: ' . PHP_VERSION, PHP_EOL;
echo 'Max integer: ' . PHP_INT_MAX, PHP_EOL;
echo 'Result: ' . $result, PHP_EOL;

結果は次のとおりです。

Linux x64、PHP 5.3

Platform: Linux Test1 3.2.0-25-generic #40-Ubuntu SMP Wed May 23 20:30:51 UTC 2012 x86_64
PHP version: 5.3.10-1ubuntu3.2
Max integer: 9223372036854775807
Result: -1511693242

Linux x86、PHP 5.3

Platform: Linux Test2 2.6.32-5-686 #1 SMP Sun May 6 04:01:19 UTC 2012 i686
PHP version: 5.3.3-7+squeeze9
Max integer: 2147483647
Result: -1511693242

Windows x86、PHP 5.3

Platform: Windows NT Test3 6.1 build 7600 i586
PHP version: 5.3.6
Max integer: 2147483647
Result: -1511693242

Linux x86、PHP 5.2

Platform: Linux Test4 2.6.18-8.el5 #1 SMP Thu Mar 15 19:57:35 EDT 2007 i686
PHP version: 5.2.10
Max integer: 2147483647
Result: -1868155656

最後の結果は、私が理由で不明な点があるため、残りの結果とは異なります。

ご覧のとおり、式の結果は-1035721791 + -2004767255int32に適合しませんが、PHP5.3はx86プラットフォームとx64プラットフォームの両方で同じ結果を生成します。また、PHP5.2はx86で誤った結果を生成します。

この違いは文書化されていますか?それはPHPの機能ですか、それともPHP 5.2のバグですか?

4

1 に答える 1

4

PHP が PHP_INT_MAX (x86 では 32 ビット) に収まらない数値を検出すると、その数値を float に変換します

PHP が整数型の境界を超える数値を検出すると、代わりに float として解釈されます。また、整数型の境界を超える数値になる操作は、代わりに float を返します。

さらに、PHP 5.3 の変更ログには次のように書かれています。

すべてのプラットフォームおよびすべてのコンパイラで一貫して倍精度を使用するように浮動小数点の動作を変更しました。(クリスチャン・ザイラー)

これがあなたが見ているものの理由であることを100%確認することはできませんが、何か関係があるはずです.

とにかく、このような大きな数を扱う場合は、浮動小数点数の精度に頼るのをやめて、代わりにBC MathGMPなどの大きな数をサポートする拡張機能を使用する必要があります。

于 2012-07-09T21:03:42.557 に答える