--- Comment from Menanteau Guy ---

New patch to accept slightly larger value than double max.
https://bugzilla.redhat.com/attachment.cgi?id=921759
is this ok and can this be go to upstream ?

thanks


> Gesendet: Freitag, 25. Juli 2014 um 20:14 Uhr
> Von: "Tommi Mäkitalo" <[email protected]>
> An: [email protected]
> Betreff: Re: [Tntnet-general] cxxtools-2.2.1-4.fc21 ppc64le - 
> std::numeric_limits<double>::max() returns 1.79769e+308
> Hi,
> 
> I looked at the patch and I guess it does not solve the problem.
> 
> The double value is still converted to long double, then to decimal and
> back to long double. Somewhere in this chain a rounding error increases
> the value slightly, that it is too large to fit into a double.
>
> The solution is to accept a slightly larger value than double max. If
> the value is just slightly bigger, it should be converted to double max.
> 
> Tommi
> 
> Am 24.07.2014 14:49, schrieb Martin Gansser:
>> --- Comment from Menanteau Guy ---
>>
>> I understood the problem of rounding error due to diffrent precision between
>> float and double but I don't see why not just process double as double 
>> instead
>> of float.
>> I did a patch to handle serialization double as double for casting and test 
>> is
>> succesfull now. Note that there was no need to create a new t_double type in
>> serializationinfo.h.
>>
>> Please could you have a look to the linked patch.
>>
>> https://bugzilla.redhat.com/attachment.cgi?id=920168
>>
>>>> Gesendet: Montag, 07. Juli 2014 um 21:01 Uhr
>>>> Von: "Tommi Mäkitalo" <[email protected]>
>>>> An: [email protected]
>>>> Betreff: Re: [Tntnet-general] cxxtools-2.2.1-4.fc21 ppc64le - 
>>>> std::numeric_limits<double>::max() returns 1.79769e+308
>>>> Hi,
>>>
>>>> The problem is a rounding error when converting double to decimal and back.
>>>>
>>>> The xmlserializer do not use scientific notation but converts floating
>>>> point values to decimal, so that the maximum double value results in
>>>> something like "17976900000000000000000000000000000000000000.....".
>>>> Internally long double is used in serialization and due to rounding
>>>> errors it may really happen, that the max double converted to long
>>>> double converted to a string and back to double max do exceed the range.
>>>>
>>>> The solution may be to accept slightly larger values than max-double.
>>>>
>>>> The actual code, which results in the error can be found in
>>>> include/cxxtools/serializationinfo.h and src/serializationinfo.cpp:
>>>>
>>>> serializationinfo.h:
>>>>
>>>> void getValue(double& value) const
>>>> { value = static_cast<double>(_getFloat("double",
>>>> std::numeric_limits<double>::max())); }
>>>>
>>>> serializationinfo.cpp:
>>>> long double SerializationInfo::_getFloat(const char* type, long double
>>>> max) const
>>>> {
>>>> ...
>>>> if (ret != std::numeric_limits<long double>::infinity()
>>>> && ret != -std::numeric_limits<long double>::infinity()
>>>> && ret == ret // check for NaN
>>>> && (ret < -max || ret > max))
>>>> {
>>>> std::ostringstream msg;
>>>> msg << "value " << ret << " does not fit into " << type;
>>>> throw std::range_error(msg.str());
>>>> }
>>>>
>>>> A possible fix is to change the acceptable limits of double to a
>>>> slightly larger value:
>>>>
>>>> serializationinfo.h:
>>>>
>>>> void getValue(double& value) const
>>>> { value = static_cast<double>(_getFloat("double",
>>>> static_cast<long
>>>> double>(std::numeric_limits<double>::max()))*1.0000000001); }
>>>>
>>>> The same should be done with float type. What do you think?
>>>>
>>>> Question: what happens, when a long double value is really too large and
>>>> it is casted to double?
>>>>
>>>>
>>>> Tommi
>>>>
>>>>
>>>> Am 07.07.2014 13:30, schrieb Martin Gansser:
>>>> Bug Report on:
>>>> https://bugzilla.redhat.com/show_bug.cgi?id=1108800[https://bugzilla.redhat.com/show_bug.cgi?id=1108800][https://bugzilla.redhat.com/show_bug.cgi?id=1108800[https://bugzilla.redhat.com/show_bug.cgi?id=1108800]]
>>>>
>>>>
>>>> Description of problem:
>>>> running test (make check) of cxxtools package on ppc64le arch, I get an 
>>>> error on test:xmlserializer::testDouble
>>>> problem occurs at testDoubleValue(std::numeric_limits<double>::max());
>>>> value returned is 1.79769e+308 and later in the test following exception 
>>>> is raised:
>>>> EXCEPTION:
>>>> value 1.79769e+308 does not fit into double
>>>>
>>>> Version-Release number of selected component (if applicable):
>>>> cxxtools-2.2.1-4.fc21 ppc64le
>>>> gcc-4.9.0-6.fc21 ppc64le
>>>>
>>>> Actual results:
>>>> xmlserializer::testDouble: EXCEPTION
>>>> value 1.79769e+308 does not fit into double
>>>>
>>>> Back to this problem, I understood value 1.79769e+308 is correct for the 
>>>> maximum value of a type double.
>>>> This means the problem is not relative to gcc. I change component to 
>>>> cxxtools for now.
>>>>
>>>> Is there any advice ?
>>>>

------------------------------------------------------------------------------
Infragistics Professional
Build stunning WinForms apps today!
Reboot your WinForms applications with our WinForms controls. 
Build a bridge from your legacy apps to the future.
http://pubads.g.doubleclick.net/gampad/clk?id=153845071&iu=/4140/ostg.clktrk
_______________________________________________
Tntnet-general mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tntnet-general

Reply via email to