18template <
typename Float>
19bool Writer::FormatScientificText(Float value, uint8_t precision,
bool alternate,
20 bool upper_case,
char* out,
size_t& out_size)
22 auto initial = NormalizeDecimal(value);
23 Float rounded = value;
26 rounded +=
static_cast<Float
>(0.5L) *
27 Power10<Float>(initial.exponent -
static_cast<int>(precision));
30 auto normalized = NormalizeDecimal(rounded);
31 int exponent = (rounded == 0) ? 0 : normalized.exponent;
32 Float scale = Power10<Float>(exponent);
35 if (!AppendBufferChar(out, float_buffer_capacity, out_size,
36 static_cast<char>(
'0' + ExtractDigit(rounded, scale))))
41 if (precision != 0 || alternate)
43 if (!AppendBufferChar(out, float_buffer_capacity, out_size,
'.'))
50 for (uint8_t i = 0; i < precision; ++i)
52 if (!AppendBufferChar(out, float_buffer_capacity, out_size,
53 static_cast<char>(
'0' + ExtractDigit(rounded, scale))))
60 return AppendExponentText(out, out_size, exponent, upper_case);
73template <
typename Float>
74bool Writer::FormatFloatText(FormatType type,
const Spec& spec, Float value,
char* out,
79 if (std::isnan(value))
81 return AppendBufferText(out, float_buffer_capacity, out_size,
82 spec.UpperCase() ?
"NAN" :
"nan");
84 if (std::isinf(value))
86 return AppendBufferText(out, float_buffer_capacity, out_size,
87 spec.UpperCase() ?
"INF" :
"inf");
90 uint8_t precision = spec.HasPrecision() ? spec.precision : DefaultFloatPrecision();
93 case FormatType::FloatFixed:
94 case FormatType::DoubleFixed:
95 case FormatType::LongDoubleFixed:
96 if (ExceedsFixedIntegerDigits(value, precision))
100 return FormatFixedText(value, precision, spec.Alternate(), out, out_size);
101 case FormatType::FloatScientific:
102 case FormatType::DoubleScientific:
103 case FormatType::LongDoubleScientific:
104 return FormatScientificText(value, precision, spec.Alternate(), spec.UpperCase(),
106 case FormatType::FloatGeneral:
107 case FormatType::DoubleGeneral:
108 case FormatType::LongDoubleGeneral:
110 uint8_t significant = precision == 0 ? 1 : precision;
111 int exponent = (value == 0) ? 0 : NormalizeDecimal(value).exponent;
112 if (exponent < -4 || exponent >= significant)
114 if (!FormatScientificText(value,
static_cast<uint8_t
>(significant - 1),
115 spec.Alternate(), spec.UpperCase(), out, out_size))
122 int fractional_precision =
static_cast<int>(significant) - (exponent + 1);
123 if (fractional_precision < 0)
125 fractional_precision = 0;
127 if (ExceedsFixedIntegerDigits(
128 value,
static_cast<uint8_t
>(fractional_precision)))
132 if (!FormatFixedText(value,
static_cast<uint8_t
>(fractional_precision),
133 spec.Alternate(), out, out_size))
139 if (!spec.Alternate())
141 out_size = TrimGeneralText(out, out_size);