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
>
>
> 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 ?
>
> ------------------------------------------------------------------------------
> Open source business process management suite built on Java and Eclipse
> Turn processes into business applications with Bonita BPM Community Edition
> Quickly connect people, data, and systems into organized workflows
> Winner of BOSSIE, CODIE, OW2 and Gartner awards
> http://p.sf.net/sfu/Bonitasoft
> _______________________________________________
> Tntnet-general mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/tntnet-general
------------------------------------------------------------------------------
Open source business process management suite built on Java and Eclipse
Turn processes into business applications with Bonita BPM Community Edition
Quickly connect people, data, and systems into organized workflows
Winner of BOSSIE, CODIE, OW2 and Gartner awards
http://p.sf.net/sfu/Bonitasoft
_______________________________________________
Tntnet-general mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tntnet-general