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: 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 elgawk
manualestados:
Las representaciones binarias de punto flotante y la aritmética son inexactas. Los valores simples como
0.1
no 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.
gawk
es 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
gawk
no está compilada para utilizar las bibliotecas GNU MPFR y MP.
Su awk
puede 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",T
todavía puedo ver la diferencia. Aumente PREC
para obtener mejores resultados.
El problema subyacente se explica en este sitio:
Lo que todo programador debe saber sobre la aritmética de punto flotante