Boost logo

Boost Users :

Subject: Re: [Boost-users] [serialization]Nans and infinity in wide xml archive
From: Paul A. Bristow (pbristow_at_[hidden])
Date: 2017-07-04 17:01:56


> -----Original Message-----
> From: Boost-users [mailto:boost-users-bounces_at_[hidden]] On Behalf Of Robert Ramey via Boost-users
> Sent: 04 July 2017 16:05
> To: Elizabeta via Boost-users
> Cc: Robert Ramey
> Subject: Re: [Boost-users] [serialization]Nans and infinity in wide xml archive
>
> On 7/4/17 2:48 AM, Elizabeta via Boost-users wrote:
> > Hi Robert
> > I did template specialization of basic_text_iprimitive::load for double, and
> > it works with visual studio 2010 compiler. Do you see something problematic
> > with this code
> >
> > namespace boost {
> > namespace archive {
> > template<> template<>
> > void basic_text_iprimitive< std::basic_istream<wchar_t,
> > std::char_traits&lt;wchar_t>> >::load<double>(double& t)
> > {
> > if (!is.fail())
> > {
> > std::wstring s;
> > getline(is, s, L'<');
> > is.putback(L'<');
> >
> > int index = s.find(L"IND");
> > if (index != -1)
> > {
> > t = std::numeric_limits<double>::quiet_NaN();
> > return;
> > }
> >
> > index = s.find(L"NAN");
> > if (index != -1)
> > {
> > t = std::numeric_limits<double>::quiet_NaN();
> > return;
> > }
> >
> > index = s.find(L"INF");
> > if (index != -1)
> > {
> > t = std::numeric_limits<double>::infinity();
> > return;
> > }
> >
> > t = std::stod(s);
> > return;
> > }
> >
> > boost::serialization::throw_exception(
> > archive_exception(archive_exception::input_stream_error)
> > );
> > }
> > }
> > }
>
> Hmmm - very clever. I have to say the specialization of just one member
> function is something that would never have occurred to me.
>
> I would wonder though. I'm not sure that the Nan literals are standard.
> I also don't trust them to be portable. Also to me it's a problem
> with stream i/o rather than serialization itself. So my instinct would
> have been to maybe make a custom manipulator or something like that. But
> still, you've got a solution which looks like it will work well for your
> needs so good luck with this.

http://www.boost.org/doc/libs/1_64_0/libs/math/doc/html/math_toolkit/fp_facets/facets_intro.html

has some info on this:

"C99 standard for output of infinity and NaN

The C99 standard does specify how infinity and NaN are formatted by printf and similar output functions, and parsed by scanf and
similar input functions.

The following string representations are used:

Table 2.1. C99 Representation of Infinity and NaN

number

string
Positive infinity
"inf" or "infinity"
Positive NaN
"nan" or "nan(...)"
Negative infinity
"-inf" or "-infinity"
Negative NaN
"-nan" or "-nan(...)"

So following C99 provides a sensible 'standard' way of handling input and output of nonfinites in C++, and this implementation
follows most of these formats."

And Elizabeta's solution is close to this. Using lower case might become more 'Standard'.

I don't know of any progress in a 'Standard' representation in C++14, 17 ....

HTH

Paul

---
Paul A. Bristow
Prizet Farmhouse
Kendal UK LA8 8AB
+44 (0) 1539 561830

Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net