9#ifndef FORTRAN_COMMON_REAL_H_
10#define FORTRAN_COMMON_REAL_H_
16#include "flang/Common/api-attrs.h"
22static constexpr int BitsForBinaryPrecision(
int binaryPrecision) {
23 switch (binaryPrecision) {
46static constexpr int MaxDecimalConversionDigits(
int binaryPrecision) {
47 switch (binaryPrecision) {
67static constexpr int MaxHexadecimalConversionDigits(
int binaryPrecision) {
68 return binaryPrecision >= 0 ? (binaryPrecision + 3) / 4 : binaryPrecision;
71static constexpr int RealKindForPrecision(
int binaryPrecision) {
72 switch (binaryPrecision) {
91static constexpr int PrecisionOfRealKind(
int kind) {
118 int bits{BitsForBinaryPrecision(binaryPrecision)};
119 bool isImplicitMSB{binaryPrecision != 64 };
120 int significandBits{binaryPrecision - isImplicitMSB};
121 int exponentBits{bits - significandBits - 1 };
122 int maxExponent{(1 << exponentBits) - 1};
123 int exponentBias{maxExponent / 2};
124 int decimalPrecision{LogBaseTwoToLogBaseTen(binaryPrecision - 1)};
125 int decimalRange{LogBaseTwoToLogBaseTen(exponentBias - 1)};
128 int maxDecimalConversionDigits{MaxDecimalConversionDigits(binaryPrecision)};
129 int maxHexadecimalConversionDigits{
130 MaxHexadecimalConversionDigits(binaryPrecision)};
134 static constexpr int LogBaseTwoToLogBaseTen(
int logb2) {
135 constexpr std::int64_t LogBaseTenOfTwoTimesTenToThe12th{301029995664};
136 constexpr std::int64_t TenToThe12th{1000000000000};
138 (logb2 * LogBaseTenOfTwoTimesTenToThe12th) / TenToThe12th};
139 return static_cast<int>(logb10);
Definition: bit-population-count.h:20