Кастомный вывод double, помогите
От: Sm0ke Россия ksi
Дата: 25.07.21 06:31
Оценка:
#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; в дальнейшем, если захочу.
Заранее спасибо.
double iostream custom
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.