Przeredagowałbym opis jako „kod, który konwertuje typ na inną reprezentację w celu zrobienia czegoś, co można było zrobić równie dobrze lub lepiej w oryginale, a następnie konwertuje go z powrotem. Istnieje wiele sytuacji, w których konwersja czegoś do inny typ, działając na nie i przekształcając go z powrotem jest całkowicie odpowiedni, a jego niepodanie spowodowałoby nieprawidłowe zachowanie.
Na przykład, gdy konwersja jest dobra:
jeden ma cztery float
wartości dowolnych znaków, których wielkości mogą się różnić aż do 1000, a na końcu należy obliczyć sumę z dokładnością do 0,625 jednostek. Konwertowanie wszystkich czterech wartości na double
, obliczanie sumy i konwertowanie wyniku z powrotem na float
będzie znacznie wydajniejsze niż w przypadku jakiegokolwiek podejścia używającego float
samego.
Wartości zmiennoprzecinkowe są co najwyżej z dokładnością do 0,5 jednostki na ostatnim miejscu (ULP). Ten przykład wymagałby, aby błąd zaokrąglania w najgorszym przypadku nie był większy niż 25% powyżej optymalnego błędu w najgorszym przypadku. Użycie podwójnej wartości da dokładność w granicach 0,5001 ULP. Podczas gdy wymóg 0.625 ULP może wydawać się wymyślony, takie wymagania są często ważne w algorytmach sukcesywnej aproksymacji. Im ściślej określone jest ograniczenie błędu, tym niższy wymóg dotyczący iteracji w najgorszym przypadku.
Na przykład, gdy konwersja jest zła:
jeden ma liczbę zmiennoprzecinkową i chce wypisać ciąg, który będzie reprezentował jego wartość w unikalny sposób. Jednym z podejść jest przekonwertowanie liczby na ciąg z określoną liczbą cyfr, próba konwersji z powrotem i sprawdzenie, czy wynik jest zgodny.
Ale w rzeczywistości jest to złe podejście. Jeśli ciąg dziesiętny reprezentuje wartość, która znajduje się prawie dokładnie w połowie odległości między dwiema wartościami zmiennoprzecinkowymi, jest dość drogi w przypadku metody ciąg-zmiennoprzecinkowy, aby zagwarantować, że zawsze da wynik bliższyfloat
wartość , a wiele takich metod konwersji nie utrzymują takiej gwarancji (między innymi zrobienie tego wymagałoby w niektórych przypadkach odczytania wszystkich cyfr liczby, nawet jeśli miała ona miliardy cyfr).
Metoda jest znacznie tańsza, aby zagwarantować, że zawsze zwróci wartość z dokładnością do 0,5625 jednostek na ostatnim miejscu (ULP) reprezentowanej wartości. Solidna „odwracalna” procedura formatowania dziesiętnego na ciąg powinna obliczyć, jak daleko jest wartość wyjściowa od prawidłowej wartości, i kontynuować wyprowadzanie cyfr, aż wynik znajdzie się w granicach 0,375 (ULP), jeśli nie 0,25 (ULP). W przeciwnym razie może wygenerować ciąg, który niektóre metody konwersji przetworzą poprawnie, ale inne metody konwersji nie.
Lepiej czasami wyprowadzić cyfrę, która może nie być „konieczna”, niż wypisać wartość, która może być źle zinterpretowana. Kluczową częścią jest to, że decyzja o tym, ile cyfr powinna być wyprowadzona, powinna być podejmowana na podstawie obliczeń numerycznych związanych z procesem wyjściowym, a nie na podstawie próby jednej konkretnej metody konwersji łańcucha z powrotem na liczbę.