¿Por qué hay una diferencia entre estos dos comandos de suma?

¿Por qué hay una diferencia entre estos dos comandos de suma?

tengo un escenario

donde estoy calculando la suma de una columna particular usando los dos comandos siguientes

¿Alguien puede explicarme en detalle qué está realizando realmente el comando?

Primer comando [cuando se usa para calcular la suma de una columna en particular]

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

Segundo comando [cuando se usa para calcular la suma de una columna en particular]

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

cuando la suma calculada usando ambos comandos es diferente. por que es esto entonces ?

Esta es la salida: ingrese la descripción de la imagen aquí Este es el archivo utilizado para calcular [descárguelo y pruébelo] (el moderador eliminó el enlace, posiblemente por motivos de seguridad)

Respuesta1

La diferencia es por lo que elgawkmanualestados:

Las representaciones binarias de punto flotante y la aritmética son inexactas. Los valores simples como 0.1no se pueden representar con precisión utilizando números binarios de punto flotante, y la precisión limitada de los números de punto flotante significa que ligeros cambios en el orden de las operaciones o la precisión del almacenamiento intermedio pueden cambiar el resultado. Para empeorar las cosas, con la aritmética de coma flotante de precisión arbitraria, puede establecer la precisión antes de comenzar un cálculo, pero luego no puede estar seguro del número de decimales significativos en el resultado final.

gawkes GNU awk. Es compatible-M:

-M
--bignum

Seleccione aritmética de precisión arbitraria en números. Esta opción no tiene ningún efecto si gawkno está compilada para utilizar las bibliotecas GNU MPFR y MP.

Su awkpuede o no ser equivalente a gawk. En mi Debian 9, cada uno de los dos comandos siguientes produce 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

Aunque printf "%.4f\n",Ttodavía puedo ver la diferencia. Aumente PRECpara obtener mejores resultados.

El problema subyacente se explica en este sitio:
Lo que todo programador debe saber sobre la aritmética de punto flotante

información relacionada