Hi Andrea,

Am 24.10.2016 um 15:40 schrieb Andrea Faulds:
Hi,

Marc Bennewitz wrote:

But I'm still curious why casting any non numeric string results in the
valid number float(0) where there is a special value in floating point
numbers declared to represent not a number values.

Because that's what C's strtod() does, and it's also what (int) does
(because that's what C's strtol()) does.

There'd be an argument for using NaN, sure, but it wouldn't be
consistent with the rest of the language. Generally, PHP assumes that a
string with no leading digits has the number value of zero. This is true
not only in (int) and (float) casts, but also in generic number coercion
operations, like with +, -, *, / and **. To change the behaviour of
(float) here would be to introduce a new inconsistency to PHP. If we go
for NaN everywhere, then we introduce a different problem: (int) should
return an integer, and the generic number coercions prefer giving you an
integer rather than a float if appropriate. Producing a NaN here would
mean you'd now get an int rather than a float, and would cause a
cascading change in operation result types which could lead to
previously working code now throwing lots of E_WARNINGs or TypeErrors
(NaN is not accepted for integer type declarations in weak mode, and all
floats are not accepted for integer type declarations in strict mode).

Thanks for your explanation.

It's totally true that on casting non numeric string to integer will result in 0 but that's a different type even if it's also a numeric type.

From my understanding PHP tries to cast from one type to another by loosing as less information as possible. In this case I see a non numeric string that gets casted to a float will loose exactly this information that it's "Not a Number" where it would be possible to keep this information. On casting this to int there is of course no possibility to keep it but I don't see where it's inconsistent as it's a different type used for different use-cases.

Having mathematical operations with non numeric strings should result in the same behavior as NaN will result in NaN which makes sense and I don't see where it will throw lots on WARNINGS or TypeErrors as it's still a float. Since PHP-7.0 there was a WARNING introduced "A non-numeric value encountered" which is nice but the result is still a valid float where "Not a Number" would be more logical. That's of course my personal opinion.

Of course changing this would introduce a BC break and therefore should be reviewed safely. But the bug #73329 shows that there is not much attention as it stayed for some versions.

This mail is not an RFC not even a proposal it's just mail to get an answered why (Thanks again) and to see how others think about.


Thanks.


Thanks
Marc

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to