
| -----Original Message----- | From: boost-bounces@lists.boost.org | [mailto:boost-bounces@lists.boost.org] On Behalf Of John Maddock | Sent: 16 March 2006 19:21 | To: Boost mailing list | Subject: [boost] [serialisation] reading and writing reals | | Attached is a sketch of how reals can be serialised in hex | notation, without | data loss when round-tripping from binary-to-text-to-binary. Quick work! And quite nice too. (although to be pedantic, the formula for precision is still not what I believe is correct, from Kahan precision(2 + std::numeric_limits<double>::digits * 3010/10000) but this is not the cause of the problem. ) | 7) I've been unable to reproduce the original problem with | native << and >> | operators with either random value tests, or with sequential | nextafter | tests, unless I start with the specific value that caused all | the fuss in | the first place :-( Any ideas for better tests much appreciated. A very brief look at this suggests that starting with values < 0.001 that cause trouble. So random testing may have trouble finding this. Using nextafter always seems to produce 35% or 3 % of values wrong (by one bit). Starting with 0.0001 ends with Original numerical value: 0.00010000000000001348 Contents of stream: 0.00010000000000001348 Deserialised value: 0.00010000000000001349 Deserialisation error! Original numerical value: 0.0001000000000000135 Contents of stream: 0.0001000000000000135 Deserialised value: 0.00010000000000001349 Deserialisation error! Original numerical value: 0.00010000000000001354 Contents of stream: 0.00010000000000001354 Deserialised value: 0.00010000000000001353 failed 450, out of 1000 I really don't have time to raise an long interrupt to look at this more fully at the moment, but it smells like a bug (except that it has already been deemed a 'feature' when I raised the same problem with the float version). So I suspect your proposal is a good workaround. But I am concerned that we have a really good test for it, or that it is provably correct, or better still both ;-)) With float, one can just about do a full test - takes all night. But even with my new Dual Core AMD X2 ;-)) an exhaustive double won't finish before it is worn out :-(( 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@hetp.u-net.com http://www.hetp.u-net.com/index.html http://www.hetp.u-net.com/Paul%20A%20Bristow%20info.html