PHP_FLOAT_MIN is positive

php.internals

Benjamin Morel

7 years ago
Hi internals, I just used PHP_FLOAT_MIN for the first time, and was surprised that it is the smallest **positive** number representable. Is this expected? This is unlike PHP_INT_MIN, which is the absolute smallest representable integer, and as such is negative: echo PHP_INT_MIN; // -9223372036854775808 echo PHP_FLOAT_MIN; // 2.2250738585072E-308 If it is intended, maybe the doc <https://www.php.net/manual/en/reserved.constants.php> should be clear about this, at the moment it is just: Smallest representable floating point number. Which is confusing IMO. Cheers, Ben

Diogo Neves

7 years ago
It really don't make much sense: <?php var_dump( PHP_FLOAT_MIN < 0 ); var_dump( PHP_INT_MIN < 0 ); On Wed, Apr 3, 2019 at 10:52 AM Benjamin Morel <benjamin.morel@gmail.com> wrote:

Joe Watkins

7 years ago
2.2250738585072E-308 This is negative. Cheers Joe On Wed, 3 Apr 2019 at 12:27, Diogo Neves <dafneves@gmail.com> wrote:

Côme Chilliet

7 years ago
Le mercredi 3 avril 2019, 13:47:55 CEST Joe Watkins a écrit :
> 2.2250738585072E-308 > > This is negative. > > Cheers > Joe
No it’s not. It’s positive and close to 0. Côme

Michael Wallner

7 years ago
On 03/04/2019 12:27, Diogo Neves wrote:
> It really don't make much sense: > > <?php > > var_dump( PHP_FLOAT_MIN < 0 ); > var_dump( PHP_INT_MIN < 0 ); > > On Wed, Apr 3, 2019 at 10:52 AM Benjamin Morel <benjamin.morel@gmail.com> > wrote: > >> Hi internals, >> >> I just used PHP_FLOAT_MIN for the first time, and was surprised that it is >> the smallest **positive** number representable. Is this expected? >> >> This is unlike PHP_INT_MIN, which is the absolute smallest representable >> integer, and as such is negative: >> >> echo PHP_INT_MIN; // -9223372036854775808 >> echo PHP_FLOAT_MIN; // 2.2250738585072E-308 >> >> If it is intended, maybe the doc >> <https://www.php.net/manual/en/reserved.constants.php> should be clear >> about this, at the moment it is just: >> >> Smallest representable floating point number. >> >> >> Which is confusing IMO.
FLT_MIN is the smallest real near 0. Are you looking for -FLT_MAX? With IEEE754 floats, there are positive and negative zeros, so the range above and below 0 is the same.
-- Regards, Mike

Benjamin Morel

7 years ago
> > It really don't make much sense: > var_dump( PHP_FLOAT_MIN < 0 ); > var_dump( PHP_INT_MIN < 0 );
I quite agree that this is an inconsistency, but I guess that it's here to stay now for BC reasons. What we can do is fix the doc.
> 2.2250738585072E-308 > This is negative.
It isn't, it is a strictly positive number with a negative exponent: 0.000(...)00022250738585072. FLT_MIN is the smallest real near 0. Are you looking for -FLT_MAX?
> With IEEE754 floats, there are positive and negative zeros, so the range > above and below 0 is the same.
It's interesting to know that - PHP_FLOAT_MAX is actually the smallest representable floating point number (unlike - PHP_INT_MAX). It would be great to document this as well. I would propose to change the current documentation to: PHP_FLOAT_MIN (float)
> Smallest representable POSITIVE floating point number. If you need the > smallest representable floating point number, use - PHP_FLOAT_MAX. > Available as of PHP 7.2.0.
What we could also do is introduce another constant to represent the actual smallest possible float, but its naming would likely conflict with PHP_FLOAT_MIN, and it does not bring much value, so I'm not sure whether this is a good idea. We did introduce a PHP_INT_MIN though, even though it was available as ~ PHP_INT_MAX, so it's worth mentioning. Thoughts? On Wed, 3 Apr 2019 at 13:50, Michael Wallner <mike@php.net> wrote:

Rowan Collins

7 years ago
On Wed, 3 Apr 2019 at 13:33, Benjamin Morel <benjamin.morel@gmail.com> wrote:
> PHP_FLOAT_MIN (float) > > Smallest representable POSITIVE floating point number. If you need the > > smallest representable floating point number, use - PHP_FLOAT_MAX. > > Available as of PHP 7.2.0. >
I'd avoid the word "smallest". PHP_FLOAT_MIN could be described as having the "smallest magnitude", and -PHP_FLOAT as being "the largest magnitude, but negative". Perhaps:
> Closest representable positive floating point number to zero. If you need
the
> negative number furthest from zero, use -PHP_FLOAT_MAX.
Regards,
-- Rowan Collins [IMSoP]

Joe Watkins

7 years ago
Thanks for explain. Cheers Joe On Wed, 3 Apr 2019 at 14:40, Rowan Collins <rowan.collins@gmail.com> wrote:

Claude Pache

7 years ago
> Le 3 avr. 2019 à 11:51, Benjamin Morel <benjamin.morel@gmail.com> a écrit : > > Hi internals, > > I just used PHP_FLOAT_MIN for the first time, and was surprised that it is > the smallest **positive** number representable. Is this expected? > > This is unlike PHP_INT_MIN, which is the absolute smallest representable > integer, and as such is negative: > > echo PHP_INT_MIN; // -9223372036854775808 > echo PHP_FLOAT_MIN; // 2.2250738585072E-308 > > If it is intended, maybe the doc > <https://www.php.net/manual/en/reserved.constants.php> should be clear > about this, at the moment it is just: > > Smallest representable floating point number. > > > Which is confusing IMO. > > Cheers, > Ben
And in order to avoid further confusion, the constant ought to be renamed PHP_FLOAT_MIN_POSITIVE. Rust named it correctly: https://doc.rust-lang.org/std/f64/constant.MIN_POSITIVE.html <https://doc.rust-lang.org/std/f64/constant.MIN_POSITIVE.html> —Claude

Sara Golemon

7 years ago
On Wed, Apr 3, 2019 at 4:52 AM Benjamin Morel <benjamin.morel@gmail.com> wrote:
> I just used PHP_FLOAT_MIN for the first time, and was surprised that it is > the smallest **positive** number representable. Is this expected? > > This is unlike PHP_INT_MIN, which is the absolute smallest representable > integer, and as such is negative: > > echo PHP_INT_MIN; // -9223372036854775808 > echo PHP_FLOAT_MIN; // 2.2250738585072E-308 > > If it is intended, maybe the doc > <https://www.php.net/manual/en/reserved.constants.php> should be clear > about this, at the moment it is just: > > Smallest representable floating point number. > > > Which is confusing IMO. > > Perhaps confusing, but not without precedent. See the C++ definitions for
::min() and ::lowest() on https://en.cppreference.com/w/cpp/types/numeric_limits. std::numeric_limits<double>::min() is a positive value very near zero. std::numeric::limits<double>::lowest() is a very large negative value. -Sara