>> On Mon, 15 Apr 2019 03:19:03 -0700 (PDT), ? Tiib <
oot...@hot.ee>
>> wrote:
>>
>> >On Saturday, 13 April 2019 02:47:26 UTC+3,
robert...@yahoo.com wrote:
>> >> Does the standard say anything about the format of the output of
>> >> special numeric values, like NaNs and Infs, when formatted by
>> >> iostreams?
>...
>> You've got it backwards. I have a library/class with types that
>> should support the normal iostream functions. Thus I have to
>> implement them, and need to handle things like Infs and NaNs.
>>
>> IOW, I'm trying to figure out what users of this library might be
>> expecting in those cases.
>
>The requirement that I mentioned which cross-references the C standard
>only applies to float, double, and long double. If you're defining your
>own type to work with those routines, it's up to you to decide what you
>want, but it would probably be best to use the behavior for those types
>as inspiration.
The types in question will interoperable with normal floats, but are
not actual floats in the sense of float/double/long double. But I am
trying to follow the normal C++ behavior with these. I *think* I have
Inf, NaN and zero handling under control in computational situations
(although I'm basically following the IEEE FP rules, signed zeros
excluded, not so much the C/C++ specs.). There's probably some open
issues with when SNaNs actually signal in some of the semi-numerical
functions.
>That being the case, you should understand the purpose of the
>"[-]nan(n-char-sequence)" option. std::nan("n-char-sequence") is defined
>as equivalent to std::strtod("NAN(n-char-sequence)"). The behavior of
>std::istream::operator>>() is defined in terms of std::strtod(), so C++
>users can also use that function to achieve the same result.
>
>The behavior of std::strtod() for such strings is implementation-
>defined. For many implementations, calling strtod() with a suitable n-
>char-sequence will create a NaN which, when printed out, displays the
>same n-char-sequence - but the C standard fails to mandate such a
>connection.
strtod(NAN()) may be suitable as-is, as are the INF() cases. An
implementation where those don't generate the same string as printf
and iostream is probably classifiable as a bit perverse. Probably
need to do some testing.
It would probably force a final commitment to requiring C++11...
>For an implementation that pre#defines __STDC_IEC_559__ the C standard
>does recommend for the <math.h> functions that "If a function with one
>or more NaN arguments returns a NaN result, the result should be the
>same as one of the NaN arguments (after possible type conversion),
>except perhaps for the sign." (C F10p13). On many implementations, the
>same is true of ordinary floating point math operations. The net result
>is that if a NaN in the inputs of a calculation is responsible for the
>fact that the result of the calculation is also a NaN, then the n-char-
>sequence can be used to determine which input NaN was responsible for
>that result.
>
>You get to choose whether you want to implement your types to allow the
>same kind of tracing - I'd recommend doing so.
We're not planning to support NaN payloads, although I'm willing to
reconsider. It would only be a modest change. While I can see the
theoretical benefit for being able to backtrack sources, I've never
seen anyone actually use the facility for such. Of course then I have
to pick a payload size, and figure out how inter-operate with floats.
There seems to be a bit of a definitional issue with the NaN-string
conversions, they appear to allow a NaN payload of zero, which for a
QNaN would acually make it an Inf. Not my issue, though.