Rechnen auf der Shell

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
rennpferd
Beiträge: 133
Registriert: 30.06.2011 11:30:08
Kontaktdaten:

Rechnen auf der Shell

Beitrag von rennpferd » 16.03.2017 11:23:41

Hallo,
gerade unternehme ich die ersten Rechenschritte auf der Shell.
Ich verwende Debian wheezy und
GNU bash, Version 4.3.30(1)-release (x86_64-pc-linux-gnu)

Das Problem:
c=$(echo "scale=50;sqrt(99)" | bc)

lcn@mars:~$ echo $c
9.94987437106619954734479821001206005178126563676806

lcn@mars:~$ echo $c | printf "Ergebnis: %10.5f \n"
Ergebnis: 0,00000

lcn@mars:~$ printf "Ergebnis: %10.5f \n" $c
bash: printf: 9.94987437106619954734479821001206005178126563676806: Ungültige Zahl.
Ergebnis: 0,00000

Warum meint printf oder die bash das sei eine ungültige Zahl?

Danke für Tips
Karlheinz

inne
Beiträge: 3281
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Rechnen auf der Shell

Beitrag von inne » 16.03.2017 11:32:28

Code: Alles auswählen

$ printf "Ergebnis: %10.5f \n" 9,94987437106619954734479821001206005178126563676806
Ergebnis:    9,94987

Benutzeravatar
heisenberg
Beiträge: 3540
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Rechnen auf der Shell

Beitrag von heisenberg » 16.03.2017 11:39:58

Erklärung: In der deutschen Lokalisierungseinstellung(LOCALE) wird ein Komma erwartet.

Wenn Du es auf POSIX/C umstellst, zählt dann der Punkt:

Code: Alles auswählen

c=$(bc <<<"scale=50;sqrt(99)")
LC_ALL=C 
printf "Ergebnis: %10.5f \n" $c
Jede Rohheit hat ihren Ursprung in einer Schwäche.

inne
Beiträge: 3281
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Rechnen auf der Shell

Beitrag von inne » 16.03.2017 11:40:58

Code: Alles auswählen

$ LANG=C printf "Ergebnis: %10.5f \n" 9.94987437106619954734479821001206005178126563676806
Ergebnis:    9.94987
// Jupp, in der infopage steht es.

rennpferd
Beiträge: 133
Registriert: 30.06.2011 11:30:08
Kontaktdaten:

Re: Rechnen auf der Shell

Beitrag von rennpferd » 16.03.2017 11:59:22

heisenberg hat geschrieben:Erklärung: In der deutschen Lokalisierungseinstellung(LOCALE) wird ein Komma erwartet.

Wenn Du es auf POSIX/C umstellst, zählt dann der Punkt:
Tja, dieser Hinweis fehlt im Artikel 'Shell-Kurs Teil 3', LinuxUser 4/2017

Danke für die Aufklärung
Karlheinz

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Rechnen auf der Shell

Beitrag von Meillo » 16.03.2017 13:27:54

rennpferd hat geschrieben: lcn@mars:~$ echo $c | printf "Ergebnis: %10.5f \n"
Ergebnis: 0,00000
Also warum das nicht funktioniert kann ich dir sagen: printf(1) liest nicht von stdin sondern verarbeitet seine Argumente.

(Den Space vor dem Newline solltest du uebrigens entfernen.)


Das mit dem Dezimaltrenner ist ein unabhaengiges Problem, das uebrigens in der Manpage printf(3) beschrieben ist.


Ich leide hier unter einem noch anderen Problem (das mal wieder typisch ist):

Code: Alles auswählen

$ printf "Ergebnis: %f\n" 9.949         
printf: %f: invalid directive
Ergebnis: 

$ LC_ALL=C printf "Ergebnis: %f\n" 9.949
printf: %f: invalid directive
Ergebnis: 

$ /usr/bin/printf "Ergebnis: %f\n" 9.949
Ergebnis: 9.949000
Und alles nur weil:

Code: Alles auswählen

     printf format [arguments ...]
            Formatted output.  Approximately the same as the
            utility printf, except that it uses the same
            Backslash expansion and I/O code as the rest of
            mksh.  This is not normally part of mksh; however,
            distributors may have added this as builtin as a
            speed hack.
... es sind immer wieder die gleichen Folgen -- Zeitperformanceoptimierungen sind zum Kotzen!
Use ed once in a while!

breakthewall
Beiträge: 507
Registriert: 30.12.2016 23:48:51

Re: Rechnen auf der Shell

Beitrag von breakthewall » 16.03.2017 23:42:06

rennpferd hat geschrieben:Hallo, gerade unternehme ich die ersten Rechenschritte auf der Shell.
Alternative Beispiele:

Code: Alles auswählen

echo $((2*4))
8

Code: Alles auswählen

echo $((24/4))
6
Ein Beispiel für Prozentrechnung:

Code: Alles auswählen

count="60"
total="224"
echo $((100*count/total))
26
Die Shell rechnet allerdings nur grob, was aber für viele Aufgaben völlig ausreicht. Will man sehr genaue Angaben haben, dann nimmt man am besten entweder bc oder awk hinzu, was ja bereits getan hast.

Anhand der Prozentrechnung wird das deutlich:

Code: Alles auswählen

echo $((100*60/224)) | bc -l
26.78571428571428571428

tobo
Beiträge: 1990
Registriert: 10.12.2008 10:51:41

Re: Rechnen auf der Shell

Beitrag von tobo » 17.03.2017 00:02:15

breakthewall hat geschrieben:Anhand der Prozentrechnung wird das deutlich:

Code: Alles auswählen

echo $((100*60/224)) | bc -l
26.78571428571428571428
Na sicher doch...

uname
Beiträge: 12072
Registriert: 03.06.2008 09:33:02

Re: Rechnen auf der Shell

Beitrag von uname » 17.03.2017 08:59:53

Da stimmt ja wohl einiges nicht mit dem Befehl. Das Ergebnis habe ich mal besser von Hand ausgerechnet.

100*60/224 =
6000/224 =
5824/224 + (6000-5824)/224 =
26 + 176/224 =
26 + 11/14 =
26 + 110/140 =
26 + (98+12)/140 =
26 + 98/140 + 12/140 =
26 + 0.7 + 12/140 =
26.7 + 6/70 =
26.7 + 1/10 * 6/7 =
26.7 + 0.0857142... (der fettgedruckte Teil wiederholt sich beliebig oft)
26.7 857142... (der fettgedruckte Teil wiederholt sich beliebig oft)

https://de.wikipedia.org/wiki/Zyklische_Zahl

breakthewall
Beiträge: 507
Registriert: 30.12.2016 23:48:51

Re: Rechnen auf der Shell

Beitrag von breakthewall » 18.03.2017 11:12:14

uname hat geschrieben:Da stimmt ja wohl einiges nicht mit dem Befehl. Das Ergebnis habe ich mal besser von Hand ausgerechnet.
Das ist nicht böse gemeint, aber offenbar stimmt etwas mit deinem Verständnis nicht. Was haben absichtlich provozierte Rechenkonstrukte, bei denen zwangsläufig immer dasselbe herauskommen muss, mit valider Prozentrechnung zutun? An sich nichts. Und um nichts anderes ging es. Geht man jetzt noch einen Schritt weiter, und vergleicht das Ergebnis mit verschiedenen Rechnern, dann kommt immer noch dasselbe korrekte Ergebnis heraus. Damit ist der ursprüngliche Befehl validiert.

tobo
Beiträge: 1990
Registriert: 10.12.2008 10:51:41

Re: Rechnen auf der Shell

Beitrag von tobo » 18.03.2017 12:15:36

breakthewall hat geschrieben:Was haben absichtlich provozierte Rechenkonstrukte, bei denen zwangsläufig immer dasselbe herauskommen muss, mit valider Prozentrechnung zutun?
Prozentrechnun? Wo? Prozentrechnung ist irgendwas mit geteilt durch 100.
Geht man jetzt noch einen Schritt weiter, und vergleicht das Ergebnis mit verschiedenen Rechnern, dann kommt immer noch dasselbe korrekte Ergebnis heraus. Damit ist der ursprüngliche Befehl validiert.
Äh, dir ist klar, dass in deinem "validen" Beispiel die Shell rechnet und bc nur ausgibt?

uname
Beiträge: 12072
Registriert: 03.06.2008 09:33:02

Re: Rechnen auf der Shell

Beitrag von uname » 19.03.2017 10:00:49

Daher war das Ergebnis auch falsch .... bzw. eigentlich richtig. Oder genauer richtig falsch im doppelten Sinne.

Prozentrechnung war eigentlich nur 100* und beim Ergebnis das %

Antworten