Das Multiplizieren von Zahlen aus jeder Zeile in der Datei ergibt einen Minuswert

Das Multiplizieren von Zahlen aus jeder Zeile in der Datei ergibt einen Minuswert
#!/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

das ist mein Skript und das ist die 1. Argumentdatei

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

das ist, was ich vom Skript bekomme, wenn ich eine Multiplikation aller Zahlen und deren Summe erhalten möchte

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

irgendwelche Ideen, was ich falsch mache?

Antwort1

Als dieSeite verlinkt von @steeldrivererklärt, ist arithmetischer Überlauf eine Tatsache in Bash. Sie könnten stattdessen:

  • Verwenden Sie eine Sprache, die von Haus aus Zahlen beliebiger Größe unterstützt, wie (glaube ich) Haskell, Lisp oder Scheme.
  • Verwenden Sie eine Sprache, die bei arithmetischem Überlauf eine Ausnahme auslöst, wie etwa Java oder Rust.
  • Überprüfen Sie, ob das Produkt nach jeder Operation abgenommen hat (da alle Ihre Zahlen positiv sind), oder
  • Überdenken Sie Ihren Ansatz, sodass Sie nicht alle Zahlen auf einmal multiplizieren müssen (was natürlich nicht immer möglich ist).

verwandte Informationen