Re[4]: Кастомный вывод double, помогите
От: watchmaker  
Дата: 28.07.21 19:06
Оценка:
Здравствуйте, B0FEE664, Вы писали:


W>>То есть условный FloatToString выводит минимальную по длине строку, для которой начинает выполнятся StringToFloat(FloatToString(x)) == x. Так десятичная дробь хотя и оказывается формально не равной исходному числу, но при чтении однозначно превращается в него обратно, так как длинный хвост младших десятичных разрядов всё равно не представим в исходном double или float. И поэтому для целей конвертации потери точности не происходит, а длина записи получается значительно короче.


BFE>Я правильно понимаю, что стандартных средств для этого такого вывода (без потери точности) в С/С++ нет?


Так в том и дело, что нет потери точности
Ну или скорее нужно сказать, что в разных контекстах под этим подразумевается разное.

То есть в описании какого-нибудь to_chars сказано, что выводимая строка по умолчанию будет самой короткой, которая будет допускать однозначное восстановление исходного числа. Если исходное значение восстанавливается точно, то значит и потери точности нет. Так что тут всё хорошо.
В какой-то другой задаче это может быть не так, и там нужно получать длинную строку. Но это уже другая задача.


А если хочешь получить длинную запись, то, конечно, никто тебя не ограничивает в возможности указать и получить свои 54 значащих цифры для double, явно передав нужное число в условный sprintf. Только это может оказаться примером ложной точности: цифр много, но при этом последние ⅔ из них ни на что не влияют — если их изменить и прочитать обратно double, то на результат это никак не повлияет.
Но стандартный способ есть.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.