I see three problems with this function: 1. [#36674] -undef results in -0.0 rather than the expected 0. This is probably easy to fix, but I don't know if undef is the only value for which (!SvIOKp(sv) && !SvNOKp(sv) && !SvPOKp(sv)).
2. [#36675] Strings starting with '-' or '+' are treaded as strings, even when they represent numbers. Now I doubt this should be changed, but at least it should be clearly documented in perlop and probably perltrap. (imagine someone extracts numbers with a regular expression or split, and expects "-100" to be treated the same way as "100") 3. There is some special treating of UTF-8 strings: they can be prefixed with '-' even when they don't start with an "identifier first" character. I was unable to provoke this behavior in practice, who knows how to do that?