Eu reformularia a descrição como "código que converte um tipo em uma representação diferente com o objetivo de fazer algo que poderia ter sido feito tão bem ou melhor no original e depois o converte novamente. Existem muitas situações em que converter algo em um um tipo diferente, agir de acordo com ela e convertê-lo de volta é totalmente apropriado, e a falha nesse procedimento resultaria em comportamento incorreto.
Como um exemplo em que a conversão é boa:
um possui quatro float
valores de sinais arbitrários cujas magnitudes podem diferir em um fator de até 1.000 e é necessário calcular a soma para 0,625 unidades em último lugar. Converter todos os quatro valores em double
, calcular a soma e converter o resultado em float
será muito mais eficiente do que qualquer abordagem usando float
sozinha.
Os valores de ponto flutuante são precisos na melhor das hipóteses para 0,5 unidades em último lugar (ULP). Este exemplo exigiria que o erro de arredondamento do pior caso não fosse superior a 25% acima do erro ideal do pior caso. Usar um duplo produzirá um valor que será preciso dentro de 0,5001 ULP. Embora um requisito de 0,625 ULP possa parecer artificial, esses requisitos geralmente são importantes em algoritmos de aproximação sucessiva. Quanto mais rigorosamente especificado o limite de erro, menor o requisito de iteração do pior caso.
Como um exemplo em que a conversão é ruim:
um tem um número de ponto flutuante e deseja gerar uma string que representará seu valor exclusivamente. Uma abordagem é converter o número em uma string com um certo número de dígitos, tentar convertê-lo novamente e verificar se o resultado corresponde.
Mas esta é realmente uma abordagem ruim. Se uma string decimal representa um valor que fica quase precisamente no ponto intermediário entre dois valores de ponto flutuante, é bastante caro para um método string-to-float garantir que sempre produzirá o float
valor mais próximo e muitos desses métodos de conversão não mantém tal garantia (entre outras coisas, isso exigiria, em alguns casos, a leitura de todos os dígitos de um número, mesmo que tivesse bilhões de dígitos).
É muito mais barato para um método garantir que sempre retorne um valor que esteja dentro de 0,5625 unidades em último lugar (ULP) do valor representado. Uma rotina de formatação "reversível" robusta de decimal para string deve calcular a distância do valor correto ao valor correto e continuar a produzir dígitos até que o resultado esteja dentro de 0,375 (ULP), se não 0,25 (ULP). Caso contrário, pode gerar uma string que alguns métodos de conversão processarão corretamente, mas outros não.
Às vezes, é melhor gerar um dígito que pode não ser "necessário" do que gerar um valor que possa ser mal interpretado. A parte principal é que a decisão de quantos dígitos devem ser impressos deve ser tomada com base em cálculos numéricos relacionados ao processo de impressão, e não no resultado da tentativa de um método específico de converter a string novamente em um número.