13template <
typename Float>
25template <
typename Float>
41template <
typename Float>
42Float Writer::Power10(
int exponent)
46 unsigned int remaining =
static_cast<unsigned int>(exponent < 0 ? -exponent : exponent);
48 while (remaining != 0)
50 if ((remaining & 1U) != 0U)
81template <
typename Float>
82Float Writer::RoundDecimal(Float value, uint8_t precision)
84 Float scale = Power10<Float>(
static_cast<int>(precision));
85 Float scaled = value * scale;
86 if (!std::isfinite(scaled))
92 return std::numeric_limits<Float>::infinity();
95 return std::nearbyint(scaled) / scale;
109template <
typename Float>
113 ScientificDigits<Float> result{};
114 auto normalized = NormalizeDecimal(value);
115 result.exponent = (value == 0) ? 0 : normalized.exponent;
116 Float decimal_scale = Power10<Float>(result.exponent);
117 Float mantissa = (value == 0) ? 0 : value / decimal_scale;
118 result.scale = Power10<Float>(
static_cast<int>(precision));
119 result.digits = std::nearbyint(mantissa * result.scale);
120 if (result.digits >=
static_cast<Float
>(10) * result.scale)
137template <
typename Float>
140 DecimalScale<Float> normalized{};
146 int binary_exponent = 0;
147 std::frexp(value, &binary_exponent);
148 constexpr Float log10_of_2 =
static_cast<Float
>(0.30102999566398119521373889472449L);
149 normalized.exponent =
150 static_cast<int>(
static_cast<Float
>(binary_exponent - 1) * log10_of_2);
151 normalized.scale = Power10<Float>(normalized.exponent);
153 Float scaled = value / normalized.scale;
156 normalized.scale /= 10;
157 --normalized.exponent;
162 normalized.scale *= 10;
163 ++normalized.exponent;
179template <
typename Float>
180uint8_t Writer::ExtractDigit(Float& value, Float scale)
182 Float scaled = value / scale;
191 auto digit =
static_cast<int>(scaled +
static_cast<Float
>(1e-12L));
201 value -=
static_cast<Float
>(digit) * scale;
206 Float epsilon = scale *
static_cast<Float
>(1e-9L);
207 if (value < 0 && value > -epsilon)
212 return static_cast<uint8_t
>(digit);
通用浮点文本格式化器使用的数学辅助函数。 / Math helpers used by the generic float text formatter.
Float scale
10 ^ exponent / 10 的 exponent 次幂
int exponent
decimal exponent / 十进制指数
科学计数法归一化后的尾数数字、缩放因子与十进制指数 / Rounded mantissa digits, scale factor, and decimal exponent after scienti...
int exponent
decimal exponent / 十进制指数
Float digits
rounded mantissa scaled to integer digits / 舍入后按整数位缩放的尾数