table of contents
        
      
      
    | std::numeric_limits::digits10(3) | C++ Standard Libary | std::numeric_limits::digits10(3) | 
NAME¶
std::numeric_limits::digits10 - std::numeric_limits::digits10
Synopsis¶
 static const int digits10; (until C++11)
  
   static constexpr int digits10 (since C++11)
  
   The value of std::numeric_limits<T>::digits10 is the number of base-10
    digits that
  
   can be represented by the type T without change, that is, any number with
    this many
  
   significant decimal digits can be converted to a value of type T and back to
    decimal
  
   form, without change due to rounding or overflow. For base-radix types, it is
    the
  
   value of digits (digits-1 for floating-point types) multiplied by \(\small
  
   \log_{10}{radix}\)log
  
   10(radix) and rounded down.
Standard specializations¶
 T value of std::numeric_limits<T>::digits10
  
   /* non-specialized */ 0
  
   bool 0
  
   char std::numeric_limits<char>::digits * std::log10(2)
  
   signed char std::numeric_limits<signed char>::digits *
    std::log10(2)
  
   unsigned char std::numeric_limits<unsigned char>::digits *
  
   std::log10(2)
  
   wchar_t std::numeric_limits<wchar_t>::digits * std::log10(2)
  
   char8_t (C++20) std::numeric_limits<char8_t>::digits *
    std::log10(2)
  
   char16_t (C++11) std::numeric_limits<char16_t>::digits *
    std::log10(2)
  
   char32_t (C++11) std::numeric_limits<char32_t>::digits *
    std::log10(2)
  
   short std::numeric_limits<short>::digits * std::log10(2)
  
   unsigned short std::numeric_limits<unsigned short>::digits *
  
   std::log10(2)
  
   int std::numeric_limits<int>::digits * std::log10(2)
  
   unsigned int std::numeric_limits<unsigned int>::digits *
    std::log10(2)
  
   long std::numeric_limits<long>::digits * std::log10(2)
  
   unsigned long std::numeric_limits<unsigned long>::digits *
  
   std::log10(2)
  
   long long (C++11) std::numeric_limits<long long>::digits *
    std::log10(2)
  
   unsigned long long (C++11) std::numeric_limits<unsigned long
    long>::digits *
  
   std::log10(2)
  
   float FLT_DIG /* 6 for IEEE float */
  
   double DBL_DIG /* 15 for IEEE double */
  
   long double LDBL_DIG /* 18 for 80-bit Intel long double; 33 for IEEE
  
   quadruple */
Example¶
 An 8-bit binary type can represent any two-digit decimal number
    exactly, but 3-digit
  
   decimal numbers 256..999 cannot be represented. The value of digits10 for an
    8-bit
  
   type is 2 (8 * std::log10(2) is 2.41)
  
   The standard 32-bit IEEE 754 floating-point type has a 24 bit fractional part
    (23
  
   bits written, one implied), which may suggest that it can represent 7 digit
    decimals
  
   (24 * std::log10(2) is 7.22), but relative rounding errors are non-uniform
    and some
  
   floating-point values with 7 decimal digits do not survive conversion to
    32-bit
  
   float and back: the smallest positive example is 8.589973e9, which becomes
  
   8.589974e9 after the roundtrip. These rounding errors cannot exceed one bit
    in the
  
   representation, and digits10 is calculated as (24-1)*std::log10(2), which is
    6.92.
  
   Rounding down results in the value 6.
  
   Likewise, the 16-digit string 9007199254740993 does not survive
    text->double->text
  
   roundtrip, becoming 9007199254740992: the 64-bit IEEE 754 type double
    guarantees
  
   this roundtrip only for 15 decimal digits.
See also¶
 radix the radix or integer base used by the representation of the
    given type
  
   [static] (public static member constant)
  
   digits number of radix digits that can be represented without change
  
   [static] (public static member constant)
  
   min_exponent one more than the smallest negative power of the radix that is a
    valid
  
   [static] normalized floating-point value
  
   (public static member constant)
  
   max_exponent one more than the largest integer power of the radix that is a
    valid
  
   [static] finite floating-point value
  
   (public static member constant)
| 2022.07.31 | http://cppreference.com |