Я б перефразував опис як "код, який перетворює тип в інше представлення для того, щоб зробити щось, що могло бути зроблено так само добре чи краще в оригіналі, а потім перетворити його назад. Є багато ситуацій, коли щось перетворюється на різного типу, діючи на нього і перетворюючи його назад цілком доречно і невдача зробити це може привести до неправильного поводження.
Як приклад, коли конверсія хороша.
Одне має чотири float
значення довільних знаків, величини яких можуть відрізнятись в коефіцієнт до 1000, і на останньому місці потрібно обчислити суму в межах 0,625 одиниць. Перетворення всіх чотирьох значень double
, обчислення суми та перетворення результату назад float
буде набагато ефективнішим, ніж будь-який підхід, використовуючи float
окремо.
плаваючою комою в кращому випадку точні до 0,5 одиниці останнього місця (ULP). Цей приклад вимагає, щоб найгірша помилка округлення була не більше ніж на 25% вище оптимальної помилки в гіршому випадку. Використання подвійного дасть значення, яке буде точним в межах 0,5001 ULP. Хоча вимога 0,625 ULP може здатися надуманою, такі вимоги часто важливі в алгоритмах послідовного наближення. Чим чіткіше задана помилка, тим нижча вимога до ітерації в гіршому випадку.
Як приклад, коли конверсія погана:
один має число з плаваючою комою і бажає вивести рядок, який буде однозначно представляти його значення. Один із підходів - перетворити число в рядок з певною кількістю цифр, спробувати перетворити його назад і побачити, чи відповідає результат.
Але це насправді поганий підхід. Якщо десятковий рядок являє собою значення, яке майже точно розташоване на півдорозі між двома значеннями з плаваючою комою, метод методу string-to float є досить дорогим, щоб гарантувати, що він завжди буде ближчеfloat
значення, і багато таких методів перетворення не не підтримувати таку гарантію (крім іншого, якщо це зробити, в деяких випадках вимагається прочитати всі цифри числа, навіть якщо це було довгі мільярди цифр).
Метод набагато дешевше гарантувати, що він завжди поверне значення, яке знаходиться в межах 0,5625 одиниць, на останньому місці (ULP) від представленого значення. Надійний "оборотний" режим форматування десяткових рядків повинен обчислювати, наскільки вихідне значення від правильного значення, і продовжувати виводити цифри, поки результат не буде в межах 0,375 (ULP), якщо не 0,25 (ULP). В іншому випадку він може вивести рядок, який деякі методи перетворення оброблять правильно, але інші методи перетворення не будуть.
Краще іноді виводити цифру, яка може не бути "необхідною", ніж виводити значення, яке може бути неправильно інтерпретоване. Ключова частина полягає в тому, що рішення про те, скільки цифр має бути виведено, має прийматися на основі чисельних обчислень, пов'язаних з процесом виведення, а не на основі спроби одного конкретного методу перетворити рядок назад у число.