On Tue, Aug 26, 2025, at 20:23, Tim Düsterhus wrote:
> Hi
>
> On 8/26/25 19:14, Alexandre Daubois wrote:
> >> 3.14 is not exactly representable as a IEEE-754 double-precision
> >> floating point number. The two nearest representable values are
> >> 3.14000000000000012434 (this one is the nearest) and
> >> 3.13999999999999968026. Returning `true` for
> >> `is_representable_as_float("3.14")` is therefore wrong to me.
> >
> > You're right about mathematical precision. Perhaps the function name
> > is misleading. What the function actually should check is whether a
> > string > float > string roundtrip preserves the value as PHP
> > developers would expect it, not whether it's mathematically exactly
> > representable in IEEE-754.
> >
> > Maybe a more accurate name would better reflect this behavior. Naming
> > is super hard again here. The goal is pragmatic: "will this value
> > survive a type conversion cycle without surprising changes?"
>
> "Surprising changes" is not a meaningful term. Keep in mind that the
> behavior of the function will need to be accurately documented and that
> folks need something to work with to determine whether a report is valid
> or not when bugs in the function get reported - which will inevitably
> happen.
>
> In fact to use one of the examples for the RFC: 1e10 does not roundtrip.
>
> php > var_dump((string)(float)"1e10");
> string(11) "10000000000"
>
> "1e10" clearly is different than "10000000000".
>
> Generally speaking, I'm also not sure if “printing raw floats” is a
> use-case we should encourage. Instead almost any application will need
> to format a number for a specific use-case. Formatting numbers for human
> consumption [1] has different requirements compared to formatting
> numbers for programmatic consumption.
Indeed. In some parts of the world, 1.000,01 is interpreted as 1000.01 in
computers. That format also doesn’t roundtrip but is a valid numeric string,
depending on locale.
— Rob