Rechnen auf der Shell
Rechnen auf der Shell
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
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
-
- Beiträge: 3289
- Registriert: 29.06.2013 17:32:10
- Lizenz eigener Beiträge: GNU General Public License
-
Kontaktdaten:
Re: Rechnen auf der Shell
Code: Alles auswählen
$ printf "Ergebnis: %10.5f \n" 9,94987437106619954734479821001206005178126563676806
Ergebnis: 9,94987
(=_=)
Unsere neue Mutter: https://www.nvidia.com/de-de/data-center/a100/
Unsere neue Mutter: https://www.nvidia.com/de-de/data-center/a100/
- heisenberg
- Beiträge: 4123
- Registriert: 04.06.2015 01:17:27
- Lizenz eigener Beiträge: MIT Lizenz
Re: Rechnen auf der Shell
Erklärung: In der deutschen Lokalisierungseinstellung(LOCALE) wird ein Komma erwartet.
Wenn Du es auf POSIX/C umstellst, zählt dann der Punkt:
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
-
- Beiträge: 3289
- Registriert: 29.06.2013 17:32:10
- Lizenz eigener Beiträge: GNU General Public License
-
Kontaktdaten:
Re: Rechnen auf der Shell
Code: Alles auswählen
$ LANG=C printf "Ergebnis: %10.5f \n" 9.94987437106619954734479821001206005178126563676806
Ergebnis: 9.94987
(=_=)
Unsere neue Mutter: https://www.nvidia.com/de-de/data-center/a100/
Unsere neue Mutter: https://www.nvidia.com/de-de/data-center/a100/
Re: Rechnen auf der Shell
Tja, dieser Hinweis fehlt im Artikel 'Shell-Kurs Teil 3', LinuxUser 4/2017heisenberg 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:
Danke für die Aufklärung
Karlheinz
Re: Rechnen auf der Shell
Also warum das nicht funktioniert kann ich dir sagen: printf(1) liest nicht von stdin sondern verarbeitet seine Argumente.rennpferd hat geschrieben: lcn@mars:~$ echo $c | printf "Ergebnis: %10.5f \n"
Ergebnis: 0,00000
(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
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.
Use ed once in a while!
-
- Beiträge: 507
- Registriert: 30.12.2016 23:48:51
Re: Rechnen auf der Shell
Alternative Beispiele:rennpferd hat geschrieben:Hallo, gerade unternehme ich die ersten Rechenschritte auf der Shell.
Code: Alles auswählen
echo $((2*4))
8
Code: Alles auswählen
echo $((24/4))
6
Code: Alles auswählen
count="60"
total="224"
echo $((100*count/total))
26
Anhand der Prozentrechnung wird das deutlich:
Code: Alles auswählen
echo $((100*60/224)) | bc -l
26.78571428571428571428
Re: Rechnen auf der Shell
Na sicher doch...breakthewall hat geschrieben:Anhand der Prozentrechnung wird das deutlich:Code: Alles auswählen
echo $((100*60/224)) | bc -l 26.78571428571428571428
Re: Rechnen auf der Shell
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
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
-
- Beiträge: 507
- Registriert: 30.12.2016 23:48:51
Re: Rechnen auf der Shell
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.uname hat geschrieben:Da stimmt ja wohl einiges nicht mit dem Befehl. Das Ergebnis habe ich mal besser von Hand ausgerechnet.
Re: Rechnen auf der Shell
Prozentrechnun? Wo? Prozentrechnung ist irgendwas mit geteilt durch 100.breakthewall hat geschrieben:Was haben absichtlich provozierte Rechenkonstrukte, bei denen zwangsläufig immer dasselbe herauskommen muss, mit valider Prozentrechnung zutun?
Äh, dir ist klar, dass in deinem "validen" Beispiel die Shell rechnet und bc nur ausgibt?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.
Re: Rechnen auf der Shell
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 %
Prozentrechnung war eigentlich nur 100* und beim Ergebnis das %