Re[2]: Fixed-point to string
От: cppguard  
Дата: 28.09.23 23:36
Оценка:
Здравствуйте, 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 нет. Рациональные числа вообще никак не решают проблему, потому что переполнение с числителе или знаменетеле так и останется переполнением.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.