
"Paul A Bristow" <pbristow@hetp.u-net.com> wrote in message news:E1GiE1n-000204-61@he304war.uk.vianw.net...
| > 2) If the type has no numeric_limits support, say if it's | a composite | > type, | > like std::complex<double> then you don't get enough digits | to tell what | > the | > problem is. Could the code default to whatever digits | long-double has? | > Again a minor change to print_log_value (in my experience | std lib's ignore | > requests for more digits than a type really has anyway, so | it should be | > harmless?). | | Could you provide the code?
I've been investigating and experimenting with this a bit. ...
So I've got as far as changing set_precision to:
void set_precision( std::ostream& ostr, mpl::false_ ) { ostr.setf(std::ios::showpoint); // Show all significant trailing zeros. if(std::numeric_limits<T>::is_specialized && std::numeric_limits<T>::radix == 10) { // All decimal types, perhaps including NTL::RR where digits10 == runtime set precision. ostr.precision(std::numeric_limits<T>::digits10); } else if (std::numeric_limits<T>::digits == 0) { // User-defined type for which digits (significand bits) value has not been assigned, // even if is_specialized == true, perhaps assigning other numeric_limits values. ostr.precision(std::numeric_limits<long double>::digits10 + 2); // But this may still not be enough to avoid misleading error messages // caused by not enough decimal digits being displayed. // User-defined types shuld define digits, even if approximately, as a workaround. } else if( std::numeric_limits<T>::is_specialized && std::numeric_limits<T>::radix == 2 ) { // && std::numeric_limits<T>::digits != 0) ostr.precision( 2 + std::numeric_limits<T>::digits * 301/1000 ); // std::numeric_limits<T>::max_digits10; for C++0x } // else default is equivalent to ostr.precision(6); } // void set_precision
And this seems to work as I suggest it should.
But the logic of this is more complicated than might appear, so other views are welcome.
(Also what are views on the usefulness of trailing zeros to show the implicit range? It is certainly helpful for in testing precision of floating-point functions).
We will have to return to this a bit later. Also I would like to hear from you the rationale for all the conditions and selected precisions. And I would also like to hear more opinions on this. Gennadiy