template <std::floating_point F>
constexpr int max_fixed_length = 2 + std::numeric_limits<F>::max_digits10 + std::numeric_limits<F>::max_exponent10;
template <typename F>
constexpr int max_exponent_digits10 = 0;
template <>
constexpr int max_exponent_digits10<float> = 2; // FLT_MAX_10_EXP = 38
template <>
constexpr int max_exponent_digits10<double> = 3; // DBL_MAX_10_EXP = 308
template <>
constexpr int max_exponent_digits10<long double> = 4; // LDBL_MAX_10_EXP = 4932
template <std::floating_point F>
constexpr int max_scientific_length = 2 + std::numeric_limits<F>::max_digits10 + 2 + max_exponent_digits10<F>;
template <typename F>
constexpr int max_exponent_digits2 = 0;
template <>
constexpr int max_exponent_digits2<float> = 3; // FLT_MAX_EXP = 128
template <>
constexpr int max_exponent_digits2<double> = 4; // DBL_MAX_EXP = 1024
template <>
constexpr int max_exponent_digits2<long double> = 5; // LDBL_MAX_EXP = 16384
template <std::floating_point F>
constexpr int max_hex_length = 2 + 1 + std::numeric_limits<F>::digits / 4 + 2 + max_exponent_digits2<F>;
int main() {
using F = float;
char buf1[8192] = {};
char buf2[8192] = {};
F FLT_MIN = -std::numeric_limits<F>::min();
F FLT_MAX = -std::numeric_limits<F>::max();
std::chars_format fmt = std::chars_format::fixed;
std::size_t precision = 30;
{//std::to_chars_result to_chars(char* first, char* last, float value);
constexpr std::size_t max = std::min(max_fixed_length<F>, max_scientific_length<F>);
std::to_chars(buf1, buf1 + max, FLT_MIN);
std::to_chars(buf2, buf2 + max, FLT_MAX);
std::cout << "FLT_MIN = " << buf1 << "\n";
std::cout << "FLT_MAX = " << buf2 << "\n\n";
std::memset(buf1, 0, sizeof(buf1));
std::memset(buf2, 0, sizeof(buf2));
}
{//std::to_chars_result to_chars(char* first, char* last, float value, std::chars_format fmt);
std::size_t max = fmt == std::chars_format::fixed ? max_fixed_length<F>
: (fmt == std::chars_format::hex ? max_hex_length<F>
: max_scientific_length<F>);
std::to_chars(buf1, buf1 + max, FLT_MIN, fmt);
std::to_chars(buf2, buf2 + max, FLT_MAX, fmt);
std::cout << "FLT_MIN = " << buf1 << "\n";
std::cout << "FLT_MAX = " << buf2 << "\n\n";
std::memset(buf1, 0, sizeof(buf1));
std::memset(buf2, 0, sizeof(buf2));
}
{//std::to_chars_result to_chars(char* first, char* last, float value, std::chars_format fmt, int precision);
std::size_t max = 2 + precision + 1;
max += fmt == std::chars_format::fixed ? std::numeric_limits<F>::max_exponent10
: (fmt == std::chars_format::hex ? 2 + max_exponent_digits2<F>
: 2 + max_exponent_digits10<F>);
std::to_chars(buf1, buf1 + max, FLT_MIN, fmt, precision);
std::to_chars(buf2, buf2 + max, FLT_MAX, fmt, precision);
std::cout << "FLT_MIN = " << buf1 << "\n";
std::cout << "FLT_MAX = " << buf2 << "\n\n";
std::memset(buf1, 0, sizeof(buf1));
std::memset(buf2, 0, sizeof(buf2));
}
return 0;
}