112class RealCharacteristics {
114 explicit constexpr RealCharacteristics(
int p) : binaryPrecision{p} {}
117 int bits{BitsForBinaryPrecision(binaryPrecision)};
118 bool isImplicitMSB{binaryPrecision != 64 };
119 int significandBits{binaryPrecision - isImplicitMSB};
120 int exponentBits{bits - significandBits - 1 };
121 int maxExponent{(1 << exponentBits) - 1};
122 int exponentBias{maxExponent / 2};
123 int decimalPrecision{LogBaseTwoToLogBaseTen(binaryPrecision - 1)};
124 int decimalRange{LogBaseTwoToLogBaseTen(exponentBias - 1)};
127 int maxDecimalConversionDigits{MaxDecimalConversionDigits(binaryPrecision)};
128 int maxHexadecimalConversionDigits{
129 MaxHexadecimalConversionDigits(binaryPrecision)};
133 static constexpr int LogBaseTwoToLogBaseTen(
int logb2) {
134 constexpr std::int64_t LogBaseTenOfTwoTimesTenToThe12th{301029995664};
135 constexpr std::int64_t TenToThe12th{1000000000000};
137 (logb2 * LogBaseTenOfTwoTimesTenToThe12th) / TenToThe12th};
138 return static_cast<int>(logb10);