Я бы перефразировал описание как «код, который преобразует тип в другое представление с целью сделать что-то, что можно было бы сделать так же хорошо или лучше в оригинале, а затем преобразовал бы его обратно. Есть много ситуаций, когда преобразование чего-либо в другой тип, действующая на него, и преобразование его обратно вполне уместно и неспособность сделать это может привести к неправильному поведению.
В качестве примера, где преобразование является хорошим: у
каждого есть четыре float
значения произвольных знаков, величины которых могут различаться с коэффициентом до 1000, и необходимо вычислить сумму с точностью до 0,625 единиц в последнем месте. Преобразование всех четырех значений в double
, вычисление суммы и обратное преобразование результата float
будет гораздо более эффективным, чем любой другой подход, использующий float
один.
Значения с плавающей точкой в лучшем случае с точностью до 0,5 единиц в последнем месте (ULP). Этот пример потребует, чтобы ошибка округления в худшем случае была не более чем на 25% выше оптимальной ошибки в худшем случае. Использование double даст значение, которое будет точным в пределах 0.5001 ULP. Хотя требование ULP 0,625 может показаться надуманным, такие требования часто важны в алгоритмах последовательного приближения. Чем точнее указана граница ошибки, тем ниже требование к итерациям в худшем случае.
В качестве примера, где преобразование плохое:
один имеет число с плавающей запятой и желает вывести строку, которая будет уникально представлять его значение. Один из подходов - преобразовать число в строку с определенным количеством цифр, попытаться преобразовать ее обратно и посмотреть, соответствует ли результат.
Но это на самом деле плохой подход. Если десятичная строка представляет значение, которое почти точно находится на полпути между двумя значениями с плавающей запятой, для метода строки-с плавающей запятой довольно дорого гарантировать, что он всегда будет давать более близкое float
значение, и многие такие методы преобразования не не поддерживать такую гарантию (среди прочего, в некоторых случаях для этого потребуется прочитать все цифры числа, даже если длина его составляет миллиарды цифр).
Для метода намного дешевле гарантировать, что он всегда будет возвращать значение, которое находится в пределах 0,5625 единиц на последнем месте (ULP) от представленного значения. Надежная «обратимая» процедура форматирования десятичных чисел в строку должна вычислять, насколько далеко выходное значение от правильного значения, и продолжать выводить цифры, пока результат не будет в пределах 0,375 (ULP), если не 0,25 (ULP). В противном случае он может вывести строку, которую некоторые методы преобразования будут обрабатывать правильно, а другие методы преобразования - нет.
Иногда лучше вывести цифру, которая может не быть «необходимой», чем вывести значение, которое может быть неправильно истолковано. Ключевым моментом является то, что решение о том, сколько цифр должно быть выведено, должно приниматься на основе численных расчетов, связанных с процессом вывода, а не в результате попытки одного конкретного метода преобразовать строку обратно в число.