#include <iostream>
using real = double;
using Char = wchar_t;
enum class n_show_sign { only_negative, always, never };
struct traits_show {
static constexpr n_show_sign show_sign = n_show_sign::only_negative;
static constexpr const Char negative_ending[] = L"";
static constexpr bool always_show_dot = false;
static constexpr const Char zero[] = L"0";
static constexpr const Char nan[] = L"nan"; // not a number
static constexpr const Char inf[] = L"inf"; // infinity
static constexpr const Char inf_[] = L"-inf"; // negative infinity
};
struct traits_dump {
static constexpr n_show_sign show_sign = n_show_sign::never;
static constexpr const Char negative_ending[] = L"_";
static constexpr bool always_show_dot = true;
static constexpr const Char zero[] = L"0.0";
static constexpr const Char nan[] = L"$float.nan#"; // not a number
static constexpr const Char inf[] = L"$float.inf#"; // infinity
static constexpr const Char inf_[] = L"$float.inf_#"; // negative infinity
};
template <class Traits>
void show(std::wostream & wo, real n) {}
Помогите написать функцию show(), которая работает следующим образом.
Если n isnan, то просто вывод Traits::nan
Если n плюс бесконечность, то просто вывод Traits::inf
Если n минус бесконечность, то просто вывод Traits::inf_
Если n 0, то просто вывод Traits::zero
* Если n < 10000 && n >= 0.001, то выводит обычным образом (без 'e')
* Иначе выводит один знак до точки, а всё остальное после точки и печатает e[+/-]NNN (напр: 1.234e+7 7.0e-9_)
* При этом учитывает параметры Traits::show_sign
* Для Traits::always_show_dot == true приписывает ".0", если точку ещё не вывели (это до 'e' когда есть)
* Для отрицательных конечных чисел вконце выводит Traits::negative_ending
Выводит все хранимые цифры без округления (макс точность).
И чтобы я мог заменить: using real = double; на: using real = long double; в дальнейшем, если захочу.
Заранее спасибо.