...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
It may appear that floating-point numbers are displayed by the Unit
Test Framework with an excessive number of decimal digits. However
the number of digits shown is chosen to avoid apparently nonsensical displays
like [1.00000
!= 1.00000]
when comparing exactly unity against a value
which is increased by just one least significant binary digit using the default
precision for float of just 6 decimal digits, given by std::numeric_limits<float>::digits10
.
The function used for the number of decimal digits displayed is that proposed
for a future C++ Standard, A
Proposal to add a max significant decimal digits value, to be called
std::numeric_limits::max_digits10();
.
For 32-bit floats, 9 decimal digits are needed to ensure a single bit change
produces a different decimal digit string.
So a much more helpful display using 9 decimal digits is thus: [1.00000000 != 1.00000012]
showing that the two values are in fact
different.
For IEEE754 32-bit float values - 9 decimal
digits are shown. For 64-bit IEEE754 double
- 17 decimal digits. For IEEE754 extended
long double using 80-bit - 21 decimal digits. For IEEE754
quadruple long double 128-bit, and SPARC extended long double 128-bit - 36
decimal digits. For floating-point types, a convenient formula to calculate
max_digits10
is: 2 + std::numeric_limits<FPT>::digits
* 3010/10000
;
Note | |
---|---|
Note that a user defined floating point type UDFPT must define |