Multiplicar números de cada línea en el archivo da un valor negativo

Multiplicar números de cada línea en el archivo da un valor negativo
#!/bin/bash

sed  's/[^0-9 ]*//g'  $1 | tr " " "\n" > outfile.txt

sed '/^\s*$/d' outfile.txt > outfile1.txt


if [ $2 == "-s" ] || [ $2 == "-si" ] || [ $2 == "-is" ]
then
sum=0;
while read num;
do ((sum += num));
done < outfile1.txt;
echo "SUMA= $sum"
fi

if [ $2 == "-i" ] || [ $2 == "-si" ] || [ $2 == "-is" ]
then
ilo=1;
while read num1;
do((ilo = num1 * ilo));
echo $num1
done < outfile1.txt;
echo "ILOCZYN= $ilo"
fi

este es mi script y este es el primer archivo de argumento

1 2 3 4 5 4 3 2 3 4 5 4 3 
2 2 2 2 22 3 34 4 4 5 5 5 d 
3 43 54 5 3

Esto es lo que obtengo del script cuando quiero multiplicar todos los números y sumarlos.

s17545@msh:~$ ./skrypt12.sh logfile.txt -si
SUMA= 241
1
.
. all of the numbers in outfile1.txt 
.
3
ILOCZYN= -2888071394797551616

¿Alguna idea de lo que estoy haciendo mal?

Respuesta1

como elpágina vinculado por @steeldriverComo explica, el desbordamiento aritmético es una realidad en Bash. En su lugar, podrías:

  • usar un lenguaje que admita números de tamaño arbitrario listos para usar, como (creo) Haskell, Lisp o Scheme,
  • use un lenguaje que generará una excepción en caso de desbordamiento aritmético, como Java o Rust,
  • comprobar si el producto ha disminuido después de cada operación (ya que todos sus números son positivos), o
  • Reconsidere su enfoque para no tener que multiplicar todos los números de una vez (lo cual, por supuesto, no siempre es posible).

información relacionada