Por que existe uma diferença entre esses dois comandos de soma?

Por que existe uma diferença entre esses dois comandos de soma?

Eu tenho um cenário

onde estou calculando a soma de uma coluna específica usando os dois comandos abaixo

alguém pode me explicar em detalhes o que realmente o comando está executando

Primeiro comando [quando usado para calcular a soma de uma coluna específica]

awk -F '"?\\|"?' '{T+=$(2)*1000} END {printf "%.2f\n",T/1000}' demofile.txt

Segundo comando [quando usado para calcular a soma de uma coluna específica]

awk -F '"?\\|"?' '{T+=$(2)} END {printf "%.2f\n",T}' demofile.txt

quando a soma calculada usando ambos os comandos é diferente. por que é tão ?

Esta é a saída: insira a descrição da imagem aqui Este é o arquivo usado para calcular [baixe e teste] (link removido pelo moderador, possivelmente por questão de segurança)

Responder1

A diferença é por causa do quegawkmanualafirma:

Representações binárias de ponto flutuante e aritmética são inexatas. Valores simples como 0.1não podem ser representados com precisão usando números binários de ponto flutuante, e a precisão limitada dos números de ponto flutuante significa que pequenas alterações na ordem das operações ou na precisão do armazenamento intermediário podem alterar o resultado. Para piorar a situação, com a aritmética de ponto flutuante de precisão arbitrária, você pode definir a precisão antes de iniciar um cálculo, mas não poderá ter certeza do número de casas decimais significativas no resultado final.

gawké GNU awk. Ele suporta-M:

-M
--bignum

Selecione aritmética de precisão arbitrária em números. Esta opção não tem efeito se gawknão for compilada para usar as bibliotecas GNU MPFR e MP.

Você awkpode ou não ser equivalente a gawk. No meu Debian 9, cada um dos dois comandos a seguir produz 25396577843.76:

LC_NUMERIC=C gawk -M -v PREC=60 -F '"?\\|"?' '{T+=$(2)*1000} END {printf "%.2f\n",T/1000}' demofile.txt
LC_NUMERIC=C gawk -M -v PREC=60 -F '"?\\|"?' '{T+=$(2)} END {printf "%.2f\n",T}' demofile.txt

Embora com printf "%.4f\n",Teu ainda possa ver a diferença. Aumente PRECpara obter melhores resultados.

O problema subjacente é explicado neste site:
O que todo programador deve saber sobre aritmética de ponto flutuante

informação relacionada