Boost logo

Boost :

From: Paul A Bristow (pbristow_at_[hidden])
Date: 2006-11-16 05:30:13


I've had some further thoughts on this.

I think a few macros will allow things to be easily 'personaized'

I can agree that not everyone wants tons of decimal digits, or trailing zeros all the time.

So why not use a macro BOOST_TEST_SHOW_ZEROS, so

#ifdef BOOST_TEST_SHOW_ZEROS
  ostr << std::showpoint; // show trailing zeros to indicate the FP precision.
#endif

#ifdef BOOST_TEST_SHOW_PRECISION
  #if (BOOST_TEST_SHOW_PRECISION > 0)
    ostr.precision(BOOST_TEST_SHOW_PRECISION) // provides a simple way to fix the precision you want.

// For example with some arbitrary precision type that would show hundreds of digits, you might want to limit the output from test.
// Or you are only interested in the first few digits because test failures are likely to be big differences.
  #else
    // leave at default precision (6)
 #endif
#else
  set_precision(...) // as at present, so existing behaviour is unchanged.
#endif

We could also meet some peoples very reasonable desire to have the integer output in hex with

#ifdef BOOST_TEST_SHOW_HEX
  ostr << std;;hex;
#endif

and even BOOST_TEST_SHOW_HEX_FP

to show the hex representation of floating-point values.
But this would be much more work ;-)

HTH more.

Paul

---
Paul A Bristow
Prizet Farmhouse, Kendal, Cumbria UK LA8 8AB
+44 1539561830 & SMS, Mobile +44 7714 330204 & SMS
pbristow_at_[hidden]
|  |  -----Original Message-----
|  |  From: boost-bounces_at_[hidden] 
|  |  [mailto:boost-bounces_at_[hidden]] On Behalf Of 
|  Gennadiy Rozental
|  |  Sent: 09 November 2006 20:42
|  |  To: boost_at_[hidden]
|  |  Subject: Re: [boost] Boost.Test feature request
|  |  
|  |  Also I would like to hear from 
|  |  you the rationale for all the conditions and selected precisions.
|  
|  My thinking is:
|  
|  1  The number of digits shown should be only those that are 
|  potentially significant for the Floating-point type being 
|  reported.  For
|  float 9, double 17, long double - varies.
|  
|  2  Despite the clutter caused by trailing zeros, these have 
|  the advantage of showing the meaningful precision for the value.
|  
|  3  The precision is very important because many obscure 
|  not-equal, and not-quite-close-enough errors involve 
|  computation, round-off
|  errors and unexpected conversions losing accuracy.  The last 
|  thing we want is error messages saying  "{1.2345} and 
|  {1.2345} are not
|  equal":  this appears to be nonsense and some users will 
|  immediately assume Boost.Test is at fault.
|  
|  Ideally precision should be 
|  std::numeric_limits<T>::max_digits10, as now accepted for 
|  C++0X, and this should be defined for ALL
|  types, built-in as User-defined; but we should not attempt 
|  this yet until it becomes standard.  However we might consider
|  designating a BOOST_HAS_MAX_DIGITS10 macro (but not yet 
|  defining it) and using this now thus:
|  
|  #ifdef BOOST_HAS_MAX_DIGITS10 && 
|  std::numeric_limits<T>::is_specialized
|    precision  = std::numeric_limits<T>::max_digits10)
|  #else
|  	existing code
|  #endif
|  
|  So for the time being - it's already complicated enough;):
|  
|  For all Decimal types, and this includes User-defined 
|  decimal types like NTL::RR, a typical arbitrary but pre-set 
|  precision, the
|  existing std::numeric_limits<T>::digit10 is correct.
|  Since std::numeric_limits<T>::digits may also be correct, it 
|  is essential to test for radix == 10 first.  As supplied, 
|  NTL::RR does
|  not have numeric_limits specialized and digits10 is 
|  undefined, but users can do this if they wish.  However, the 
|  precision in bits
|  is set at compile time, but the displayed digits, 
|  effectively digits10, can be altered at run-time.
|  
|  For built-in floating point types, the formula you are now 
|  using, which derives from  std::numeric_limits<T>digits, the 
|  number of
|  significand bits, is correct.
|  
|  For UD floating-point types, provided 
|  std::numeric_limits<T>digits is valid (has been specilized, 
|  and has had a value assigned (all
|  unassigned are zero by default), this formula is correct.
|  
|  If digits is (still) zero, then the most likely reason is a 
|  high (but not necessarily fixed at compile time) precision.
|  
|  For any other radix or where std::numeric_limits<T>::digits 
|  = 0 (almost certainly unassigned), we really don't have much 
|  to go on.
|  But the default precision of 6 decimal digits is almost 
|  certainly not the most helpful - far too few.  So John 
|  Maddock has suggested
|  using the precision of the most accurate built-in long 
|  double type std::numeric_limits<long double>::digits.  This 
|  deals with the
|  case of a composite type like <complex>.  It may give some 
|  superflous, but harmless decimal digits, but should never produce an
|  unhelpful "{1.2345} and {1.2345} are not equal" message.
|  
|  Ideally the user should always specialize numeric_limits for 
|  his type, and assign a suitable value to digits, digits10 and/or
|  eventually max_digits10.
|  
|  For integer types, precision is meaningless, so ideally 
|  set_precision should not be called at all, or do nothing.
|  
|  HTH

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk