Boost logo

Boost Users :

Subject: Re: [Boost-users] boost serialization stream error question
From: Robert Ramey (ramey_at_[hidden])
Date: 2010-02-01 00:25:10


OvermindDL1 wrote:
> On Sun, Jan 31, 2010 at 6:11 PM, Robert Ramey <ramey_at_[hidden]> wrote:
>> OvermindDL1 wrote:
>>> On Sun, Jan 31, 2010 at 10:34 AM, Robert Ramey <ramey_at_[hidden]>
>>> wrote:
>>>>> The problem is caused by double values less than DBL_MIN.
>>>>> Apparently, streaming such values in causes the input stream
>>>>> fail_bit to be set, which causes the serialization lib to throw an
>>>>> exception.
>>>>
>>>> The standard stream library writes out NaN values as text, but
>>>> cannot read them.
>>>>
>>>> It shows up in various places besides the serialization library -
>>>> e.g. lexical_cast.
>>>>
>>>> Work has been done on this. I believe that there is code in vault
>>>> which deals with this.
>>>
>>> Why not just memcpy the double into the stream? (or bitcast it to
>>> long long or so?)
>>
>> text and xml archives are meant to be portable. This would conflict
>> with that requirement. Then there is the fact that putting binary
>> data into the text stream might create some conflicts depending on
>> the characterset etc. In general, one cannot put binary data into a
>> text stream and be able to count on getting it back.
>>
>> So here are a couple of options in order of my personal preference.
>>
>> a) Just avoid saving and restoring NaN's. They just waste space
>> in the archive anyway. There a number ways to do this.
>> b) find the fixup for floating point stream in either the vault
>> and/or sand box and install that.
>> b) wrap the double in a binary_wrapper and serialize that. This
>> would also break portability.
>
> What about for text archives print/read it out in the completely
> portable C99 Hex floating point constant? It encodes all possible
> floating point values with no loss (including NaNs and such). It is
> basically just a hex representation of the memory, see the C99 hex
> floating point standard for how it works.

This is the first I've heard of this. I couldn't find any documentation
on it either. I know some people have been working on addressing
this and it has been found to be non-trivial. In any case, it's not
something that would be in the serialization library but rather in
the standard stream or some extension of it. I am surprised to
hear about something like this in C99 which hasn't been included
in standard stream C++ library. Makes me think I'm missing
something here.

Robert Ramey

> _______________________________________________
> Boost-users mailing list
> Boost-users_at_[hidden]
> http://lists.boost.org/mailman/listinfo.cgi/boost-users


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