Здравствуйте, fk0, Вы писали:
fk0> Вот здесь 1 — это int, а sizeof(value) может быть меньше чем sizeof(intmax_t).
И? Каким боком sizeof тут?
fk0> А что если N задали нулевым? Можно же!
Можно, конечно. Ещё можно комп облучить, и тогда некоторые биты в памяти поменяют своё значение.
fk0> А что если value -- знаковое. Сдвиг вправо может быть с сохранением знака.
fk0>А может быть без.
Может. А ещё value может быть классом, ссылкой и т.д.
fk0> Такой параметр шаблона по-умолчанию -- источник ошибок.
А какой — не источник?
fk0> Опять же Position = 0 и UB.
Но зачем?
fk0> Почему пятёрка захардкожена, что она значит?
Она означает множитель, который изначально равен 5.
fk0> Может быть переполнение в acc. Вообще непонятно зачем здесь какие-то рекурсивные вычисления,
fk0>по-моему всё сводится к одной линейной арифметической операции и отправке числа в ostream/snprintf/std::format.
Предлагаешь длинную арифметику вводить для acc? ostream/snprintf/std::format — ничего из этого не умеет выводить fixed-point.
fk0> Вообще для ввода-вывода (где перформанс не критичен) не зазорно сконвертировать в double.
Боюсь, что конвертация fixed-pont -> floating-point может выйти ещё тяжелее чем вывод в строку.
fk0> Вообще почему именно "числа с фиксированной точкой", а не рационалные дроби? Кажется не нужна эта
fk0>фиксированная точка вовсе. Проще тупо считать всегда в целых, домножив всё на некий коэффициент K
fk0>чтоб значения не утонули в шумах квантизации. А потом при выводе обратно поделить на K. В принципе
fk0>число с фиксированной точкой это оно и есть, только там K -- обязательно 2^N. Но это же совершенно
fk0>не обязательно. Хотя и удобно для быстрого деления. Но давно уже не обязательно: современные процессоры
fk0>уж точно наверняка имеют быстрый умножитель, с помощью которого деление или умножение на константу
fk0>делается быстро.
Смешались в кучу кони-люди. Фиксированная точка удобна там, где вычисления находятся в одном диапазоне, а аппаратной поддержки float/double нет. Рациональные числа вообще никак не решают проблему, потому что переполнение с числителе или знаменетеле так и останется переполнением.