Re: strtod and NaN vs. zero

From: Date: Sun, 23 Oct 2016 19:13:12 +0000
Subject: Re: strtod and NaN vs. zero
References: 1 2  Groups: php.internals 
Request: Send a blank email to internals+get-96564@lists.php.net to get a copy of this message
Am 23.10.2016 um 13:49 schrieb Niklas Keller:
2016-10-23 12:55 GMT+02:00 Marc Bennewitz <dev@mabe.berlin <mailto:dev@mabe.berlin>>:
    Hi internals,
    On casting a non numeric value to a float in PHP the result will be
    float(0).
    In PHP-7.0 an exception was introduced that on casting a string
    "/\s*NaN\s*/i" will result in float(NaN).
    https://3v4l.org/2Xakm
    Wouldn't it be more logical and expected to return NaN in all cases
    of casting a non numeric string to a floating point number?
    Thanks
    Marc
    --
    PHP Internals - PHP Runtime Development Mailing List
    To unsubscribe, visit: http://www.php.net/unsub.php
+1
I just noticed that the behavior change in PHP-7 has been "fixed" already by https://bugs.php.net/bug.php?id=73329. So the old behavior will be presented soon. 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. I also did a small research on other languages and found the following: C strtod returns float(0) -> but supports converting the strings "INFINITY" or "NAN" (case-insensitive) JavaScript returns NaN Python throws ValueError: could not convert string to float -> but supports the string +/- "NaN", "Inf", "Infinity" (case-insensitive) Perl returns float(0) -> but supports the string +/- "NaN", "Inf", "Infinity" (case-insensitive) So there is a nice mix of how other languages will handle this problem. In my opinion it still makes much more sense to return NaN in any case a not numeric string will be casted to float incl. "Inf" and "Infinity". (If spaces should be ignored or suffixes allowed is another question) = The beginning of a string must contain at least one number by ignoring spaces to be casted to a valid floating point number. In any other situations NaN must be returned because this represents what it is = Not a Number. So for me the following example table makes sense: In -> Out "" -> NaN " " -> NaN "+" -> NaN "-" -> NaN "." -> NaN ".5" -> 0.5 "0.5" -> 0.5 " 0.5" -> 0.5 "0" -> 0 " 0" -> 0 "Nan" -> NaN "Inf" -> NaN "Info" -> NaN "foo" -> NaN ".foo" -> NaN ".2foo" -> 0.2 " .2foo" -> 0.2 "foo1" -> NaN "foo." -> NaN "foo0.1" -> NaN Thoughts Marc
Regards, Niklas


« previous php.internals (#96564) next »