There has been some discussion about a minor improvement to lexical_cast to
ensure that a loopback test like:

any_type any_value == lexical_cast<T>(lexical_cast<string>(any_value))

is always true

The following replacement for the original code (using digits10+1) works for
specialised radix 2 types:

if(std::numeric_limits<Target>::is_specialized
  && std::numeric_limits<Target>::radix == 2)
{
  stream.precision(2 + std::numeric_limits<Target>::digits * 301/1000);
}
else if(std::numeric_limits<Source>::is_specialized
  && std::numeric_limits<Source>::radix == 2)
{
  stream.precision(2 + std::numeric_limits<Source>::digits * 301/1000);
}

As in the current version, for other types the default precision is used, and
you may not get what you expect.  I think this is OK, but one could throw an
exception.  I propose a comment instead

// Warning: else the default stream precision (usually 6) will be used,
// which may not be enough significant decimal digits to avoid losing precision,
// for example in a loopback test like
// some_type any_value == lexical_cast<T>(lexical_cast<string>(any_value));

If there are no objections, can someone with sufficient authority patch
lexical_cast.hpp?

Paul

Paul A Bristow, Prizet Farmhouse, Kendal, Cumbria, LA8 8AB  UK
+44 1539 561830   Mobile +44 7714 33 02 04
mailto:[EMAIL PROTECTED]



_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to