Introduce PHP_INT_MAX_SAFE constant similar to JS's Number.MAX_SAFE_INTEGER constant

php.internals

Gina P. Banyard

1 year ago
Hello internals, I'm mailing the list for the bike shed of the naming of a new constant I think we should introduce in PHP which I'm currently calling PHP_INT_MAX_SAFE. The purpose of this integer is to indicate what is the maximal integer value that can be correctly represented by a float. On 32 bits this is equal to PHP_INT_MAX, but on 64 bits it is 9007199254740991 (which is 2^(53) – 1) as the mantissa of a floating point number is 52 bits. For more information, please see the MDN documentation about Number.MAX_SAFE_INTEGER. [1] The implementation is very simple and the PR is https://github.com/php/php-src/pull/19126 Best regards, Gina P. Banyard [1] https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER

Tim Düsterhus

1 year ago
Hi Am 2025-07-14 13:54, schrieb Gina P. Banyard:
> The purpose of this integer is to indicate what is the maximal integer > value that can be correctly represented by a float. > On 32 bits this is equal to PHP_INT_MAX, but on 64 bits it is > 9007199254740991 (which is 2^(53) – 1) as the mantissa of a floating > point number is 52 bits.
I don't understand why this should be equal to PHP_INT_MAX for 32 Bit builds. The largest integer that can be safely represented by a float is 2^53-1 for both 32 and 64 Bit builds of PHP. More generally, I do not understand the value of the constant. PHP has proper integers, whereas JavaScript does not. Best regards Tim Düsterhu

Alexandre Daubois

1 year ago
Hi Gina, Le jeu. 24 juil. 2025 à 14:46, Gina P. Banyard <internals@gpb.moe> a écrit :
> > Hello internals, > > I'm mailing the list for the bike shed of the naming of a new constant I think we should introduce in PHP which I'm currently calling PHP_INT_MAX_SAFE. > The purpose of this integer is to indicate what is the maximal integer value that can be correctly represented by a float. > On 32 bits this is equal to PHP_INT_MAX, but on 64 bits it is 9007199254740991 (which is 2^(53) – 1) as the mantissa of a floating point number is 52 bits.
What about an actual function returning if an integer is safe or not? We actually ran into this lately with the JsonPath component of Symfony. I wrote a userland function for this: https://github.com/symfony/symfony/blob/d3a0df0243e1c68598fa066eaa6cd0cf39f256dc/src/Symfony/Component/JsonPath/JsonPathUtils.php#L243 Given the numerous interactions between PHP and JSON, I think it would be useful to have a function like "is_safe_integer()". Best, Alex