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: 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 quegawk
manualafirma:
Representações binárias de ponto flutuante e aritmética são inexatas. Valores simples como
0.1
nã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
gawk
não for compilada para usar as bibliotecas GNU MPFR e MP.
Você awk
pode 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",T
eu ainda possa ver a diferença. Aumente PREC
para obter melhores resultados.
O problema subjacente é explicado neste site:
O que todo programador deve saber sobre aritmética de ponto flutuante