15inline bool Writer::FormatF32FixedPrecText(
float value, uint8_t precision,
char* out,
20 if (std::isnan(value))
22 return AppendBufferText(out, float_buffer_capacity, out_size,
"nan");
24 if (std::isinf(value))
26 return AppendBufferText(out, float_buffer_capacity, out_size,
"inf");
29 if (precision < f32_decimal_scales_u32.size() && value < f32_u32_overflow_limit)
31 uint32_t integer_part =
static_cast<uint32_t
>(value);
32 uint32_t scale = f32_decimal_scales_u32[precision];
33 uint64_t scaled_total = RoundScaledF32(value, scale);
34 uint64_t scaled_integer =
static_cast<uint64_t
>(integer_part) * scale;
35 uint32_t fractional_part =
36 (scaled_total >= scaled_integer)
37 ?
static_cast<uint32_t
>(scaled_total - scaled_integer)
40 if (fractional_part >= scale)
42 fractional_part -= scale;
43 if (integer_part == std::numeric_limits<uint32_t>::max())
45 if (!AppendBufferText(out, float_buffer_capacity, out_size,
"4294967296"))
53 if (!AppendBufferChar(out, float_buffer_capacity, out_size,
'.'))
57 for (uint8_t i = 0; i < precision; ++i)
59 if (!AppendBufferChar(out, float_buffer_capacity, out_size,
'0'))
69 if (!AppendBufferU32ZeroPad(out, float_buffer_capacity, out_size, integer_part, 1))
77 if (!AppendBufferChar(out, float_buffer_capacity, out_size,
'.'))
81 return AppendBufferU32ZeroPad(out, float_buffer_capacity, out_size, fractional_part,
85 float rounded = value;
86 float rounding = 0.5f;
87 for (uint8_t i = 0; i < precision; ++i)
95 if (!AppendBufferChar(out, float_buffer_capacity, out_size,
'0'))
102 float integer_scale = 1.0f;
105 float next_scale = integer_scale * 10.0f;
106 if (!std::isfinite(next_scale) || rounded < next_scale)
110 integer_scale = next_scale;
113 while (integer_scale >= 1.0f)
115 int digit =
static_cast<int>(rounded / integer_scale);
125 if (!AppendBufferChar(out, float_buffer_capacity, out_size,
126 static_cast<char>(
'0' + digit)))
131 rounded -=
static_cast<float>(digit) * integer_scale;
132 float epsilon = integer_scale * 1e-6f;
133 if (rounded < 0.0f && rounded > -epsilon)
137 integer_scale *= 0.1f;
145 if (!AppendBufferChar(out, float_buffer_capacity, out_size,
'.'))
150 for (uint8_t i = 0; i < precision; ++i)
153 int digit =
static_cast<int>(rounded + 1e-6f);
163 if (!AppendBufferChar(out, float_buffer_capacity, out_size,
164 static_cast<char>(
'0' + digit)))
169 rounded -=
static_cast<float>(digit);
170 if (rounded < 0.0f && rounded > -1e-5f)
189template <
typename Float>
190bool Writer::FormatFixedText(Float value, uint8_t precision,
bool alternate,
char* out,
194 value +
static_cast<Float
>(0.5L) * Power10<Float>(-
static_cast<int>(precision));
195 auto normalized = NormalizeDecimal(rounded);
196 int integer_exponent = (rounded == 0) ? 0 : normalized.exponent;
197 int start_pos = (integer_exponent > 0) ? integer_exponent : 0;
198 Float scale = Power10<Float>(start_pos);
201 for (
int pos = start_pos; pos >= 0; --pos)
203 if (!AppendBufferChar(out, float_buffer_capacity, out_size,
204 static_cast<char>(
'0' + ExtractDigit(rounded, scale))))
211 if (precision != 0 || alternate)
213 if (!AppendBufferChar(out, float_buffer_capacity, out_size,
'.'))
219 for (uint8_t i = 0; i < precision; ++i)
221 if (!AppendBufferChar(out, float_buffer_capacity, out_size,
222 static_cast<char>(
'0' + ExtractDigit(rounded, scale))))