<div dir="ltr">Hi,<div><br></div><div>21.5p4 and 21.5p11 say that std::stof() and std::stod() are both supposed to call strtod() (for char*) or wcstod() (for wchar_t*). libc++ currently calls strtof() / wcstof() from std::stof(), so the attached patch fixes this.<br>
</div><div><br></div><div>This has a surprising effect: 21.5p6 and 21.5p13 say that stof() should throw out_of_range if strtod / wcstod set errno to ERANGE. Now, for stof("1.e60") will call strtod("1.e60", ...). 1.e60 fits in a double, so strtod() won't set ERANGE. But stof() returns a float, and this double converted to a float does result in INFINITY. So it sounds like the standard demands that stof("1.e60") returns INFINITY but does not throw, while std::stod("1.e360") is supposed to return INFINITY and throw out_of_range (assuming the C library sets ERANGE in this case, which seems like a reasonable assumption.)</div>
<div><br>So I'm not sure if the standard is specifying what it intends to specify here. If someone familiar with DRs could report, that'd be cool.</div><div><br></div><div>Nevertheless, the attached patch makes libc++ do what the standard demands (and updates one test).</div>
<div><br></div><div>Nico</div></div>