Seu instinto está basicamente certo, a classificação em ordem crescente (de magnitude) geralmente melhora as coisas um pouco. Considere o caso em que estamos adicionando flutuadores de precisão simples (32 bits) e há 1 bilhão de valores iguais a 1 / (1 bilhão) e um valor igual a 1. Se o 1 vier primeiro, a soma virá para 1, visto que 1 + (1/1 bilhão) é 1 devido à perda de precisão. Cada adição não tem efeito algum no total.
Se os valores pequenos vierem primeiro, eles pelo menos somarão alguma coisa, embora mesmo assim eu tenha 2 ^ 30 deles, enquanto depois de 2 ^ 25 ou mais estou de volta à situação em que cada um individualmente não está afetando o total não mais. Ainda vou precisar de mais truques.
Esse é um caso extremo, mas em geral adicionar dois valores de magnitude semelhante é mais preciso do que adicionar dois valores de magnitudes muito diferentes, já que você "descarta" menos bits de precisão no valor menor dessa forma. Classificando os números, você agrupa valores de magnitude semelhante e, ao adicioná-los em ordem crescente, dá aos valores pequenos uma "chance" de atingir cumulativamente a magnitude dos números maiores.
Ainda assim, se números negativos estiverem envolvidos, é fácil "enganar" essa abordagem. Considere três valores para somar {1, -1, 1 billionth}
,. A soma aritmeticamente correta é 1 billionth
, mas se minha primeira adição envolver o valor minúsculo, minha soma final será 0. Das 6 ordens possíveis, apenas 2 são "corretas" - {1, -1, 1 billionth}
e {-1, 1, 1 billionth}
. Todas as 6 ordens fornecem resultados que são precisos na escala do valor de maior magnitude na entrada (0,0000001% de saída), mas para 4 delas o resultado é impreciso na escala da solução verdadeira (100% de saída). O problema específico que você está resolvendo dirá se o primeiro é bom o suficiente ou não.
Na verdade, você pode fazer muito mais truques do que apenas adicioná-los em ordem. Se você tiver muitos valores muito pequenos, um número médio de valores médios e um pequeno número de valores grandes, então pode ser mais preciso primeiro somar todos os pequenos e, em seguida, somar separadamente os médios, adicionar esses dois totais juntos, em seguida, adicione os grandes. Não é nada trivial encontrar a combinação mais precisa de adições de ponto flutuante, mas para lidar com casos realmente ruins, você pode manter toda uma matriz de totais em execução em diferentes magnitudes, adicionar cada novo valor ao total que melhor corresponda à sua magnitude, e quando um total corrente começar a ficar muito grande para sua magnitude, some-o ao próximo total e comece um novo. Levado ao extremo lógico, este processo é equivalente a realizar a soma em um tipo de precisão arbitrária (então você ' d fazer isso). Mas dada a escolha simplista de adicionar ordem de magnitude ascendente ou descendente, ascender é a melhor aposta.
Ele tem alguma relação com a programação do mundo real, já que há alguns casos em que seu cálculo pode dar muito errado se você acidentalmente cortar uma cauda "pesada" consistindo de um grande número de valores, cada um dos quais é muito pequeno para afetar individualmente a soma ou se você descartar precisão demais de muitos valores pequenos que individualmente afetam apenas os últimos bits da soma. Nos casos em que a cauda é insignificante, você provavelmente não se importa. Por exemplo, se você estiver apenas adicionando um pequeno número de valores em primeiro lugar e estiver usando apenas alguns algarismos significativos da soma.