|
Boost : |
From: Paul A Bristow (pbristow_at_[hidden])
Date: 2006-03-15 07:13:13
I have also re-tested this on VS 2005 release :-(((
My test and/or memory was obviously faulty.
Using 100 tests with nextafter, starting with the value you found faulty, I
find 38 failures (all one bit wrong on input) - about the one third I found
in previous tests.
So I confirm my view that this is a Microsoft 'Lack Of Quality Feature'.
To be fair, this is a rather hard problem, though there are proven solutions
which have been proposed, but not widely implemented, as I asked about and
got some info on a recent post.
lists.boost.org/Archives/boost/2006/02/date.php
But I fear that this does NOT help you just now. Sorry.
I am having a crack at using the Burger and Dvbvig method but have yet to
fully understand it.
Paul
-- Paul A Bristow Prizet Farmhouse, Kendal, Cumbria UK LA8 8AB Phone and SMS text +44 1539 561830, Mobile and SMS text +44 7714 330204 mailto: pbristow_at_[hidden] http://www.hetp.u-net.com/index.html http://www.hetp.u-net.com/Paul%20A%20Bristow%20info.html | -----Original Message----- | From: boost-bounces_at_[hidden] | [mailto:boost-bounces_at_[hidden]] On Behalf Of Paul Giaccone | Sent: 15 March 2006 11:06 | To: boost_at_[hidden] | Subject: Re: [boost] [serialization] | Serialisation/deserialisation offloating-point values | | Paul A Bristow wrote: | | >If you want to test round-tripping on your platform and std | lib without | >actually using serialization, | > | >may I suggest a loop including something like: | > | > double a = some start value; | > double aa; // to hold the read back. | > | > std::stringstream s; | > s.precision(2+std::numeric_limits<double>::digits * 3010/10000); | > // cout << "output " << a; | > s << a; // output to string s | > //cout << ", s.str() is " << s.str(); | > s >> aa; // read back in. | > //cout << ", read back " << aa << endl; | > if (a != aa) | > { | > cout << "error " << a << tab << aa << endl; | > } | > a = nextafter(a, std::numeric_limits<double>::max()); | // Make one | >bit bigger? | > | > | > | [...] | | >This should give you a feel for the risk of failure. | > | >Paul | > | > | Funnily enough, I've just written a program to test the value I | originally posted about (below, followed by its output): | | #include <string> | #include <sstream> | #include <iostream> | #include <iomanip> | #include <limits> | | int main(void) | { | const double orig_value = 0.0019075645054089487; | std::stringstream stream; | | double num; | stream << std::setprecision(2 + | std::numeric_limits<double>::digits | * 3030/10000); | stream << orig_value; | stream >> num; | | if (num == orig_value) | { | std::cout << "Match" << std::endl; | } | else | { | std::cout << "Deserialisation error" << std::endl; | std::cout << std::setprecision(2 + | std::numeric_limits<double>::digits * 3030/10000); | std::cout << "Original numerical value: " << orig_value << | std::endl; | std::cout << "Contents of stream: " << stream.str() | << std::endl; | std::cout << "Deserialised value: " << num << std::endl; | } | | return 0; | } | | | Output: | | Deserialisation error | Original numerical value: 0.0019075645054089487 | Contents of stream: 0.0019075645054089487 | Deserialised value: 0.0019075645054089489 | | | This is the same result as in my original thread, so it does | indeed look | like a Microsoft issue with redirection (>>), not with | serialisation itself. | | Paul | | | _______________________________________________ | Unsubscribe & other changes: | http://lists.boost.org/mailman/listinfo.cgi/boost |
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk