Boost logo

Boost Users :

Subject: Re: [Boost-users] boost serialization stream error question
From: OvermindDL1 (overminddl1_at_[hidden])
Date: 2010-02-01 00:49:10


On Sun, Jan 31, 2010 at 10:25 PM, Robert Ramey <ramey_at_[hidden]> wrote:
> 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.

The C++98 standard predates the C99 standard, and it does not include
some C99 things (like varadic macros as well as float-hex
representations). Hopefully it is included in C++1x though.


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