Wie führt man Integer- und Float-Berechnungen in Bash oder anderen Sprachen/Frameworks durch?

Wie führt man Integer- und Float-Berechnungen in Bash oder anderen Sprachen/Frameworks durch?

Bei wörtlicher Verwendung echo "20+5"entsteht der Text „ 20+5“.

25Mit welchem ​​Befehl kann ich in diesem Fall die numerische Summe erhalten ?

Und wie geht das am einfachsten, wenn man nur Bash für Gleitkommazahlen verwendet? Beispielsweise wird :( echo $((3224/3807.0))ausgegeben 0.

Ich suche nach Antworten entweder unter Verwendung der grundlegenden Befehlsshell („Befehlszeile“) selbst oder durch die Verwendung von Sprachen, die über die Befehlszeile verfügbar sind.

Antwort1

Es gibt viele Möglichkeiten!!!

Zusammenfassung

$ printf %.10f\\n "$((10**9 * 20/7))e-9"   # many shells. Not mksh.
$ echo "$((20.0/7))"                       # (ksh93/zsh/yash, some bash)
$ awk "BEGIN {print (20+5)/2}"
$ zcalc
$ bc <<< 20+5/2
$ bc <<< "scale=4; (20+5)/2"
$ dc <<< "4 k 20 5 + 2 / p"
$ expr 20 + 5
$ calc 2 + 4
$ node -pe 20+5/2  # Uses the power of JavaScript, e.g. : node -pe 20+5/Math.PI
$ echo 20 5 2 / + p | dc 
$ echo 4 k 20 5 2 / + p | dc 
$ perl -E "say 20+5/2"
$ python -c "print(20+5/2)"
$ python -c "print(20+5/2.0)"
$ clisp -x "(+ 2 2)"
$ lua -e "print(20+5/2)"
$ php -r 'echo 20+5/2;'
$ ruby -e 'p 20+5/2'
$ ruby -e 'p 20+5/2.0'
$ guile -c '(display (+ 20 (/ 5 2)))'
$ guile -c '(display (+ 20 (/ 5 2.0)))'
$ slsh -e 'printf("%f",20+5/2)'
$ slsh -e 'printf("%f",20+5/2.0)'
$ tclsh <<< 'puts [expr 20+5/2]'
$ tclsh <<< 'puts [expr 20+5/2.0]'
$ sqlite3 <<< 'select 20+5/2;'
$ sqlite3 <<< 'select 20+5/2.0;'
$ echo 'select 1 + 1;' | sqlite3 
$ psql -tAc 'select 1+1'
$ R -q -e 'print(sd(rnorm(1000)))'
$ r -e 'cat(pi^2, "\n")'
$ r -e 'print(sum(1:100))'
$ smjs
$ jspl
$ gs -q  <<< "5 2 div 20 add  ="

Einzelheiten

Muscheln

Sie können die POSIX-Arithmetikerweiterung verwenden fürganze ZahlArithmetikecho "$((...))":

$ echo "$((20+5))"
25
$ echo "$((20+5/2))"
22

Ziemlich tragbar (ash dash yash bash ksh93 lksh zsh):
Durch die Verwendung der printf-Fähigkeit zum Drucken von Gleitkommazahlen können wir die meisten Shells erweitern, um Gleitkommaberechnungen durchzuführen, allerdings mit einem begrenzten Bereich (nicht mehr als 10 Ziffern):

$ printf %.10f\\n "$((1000000000 *   20/7  ))e-9"
2.8571428570

ksh93,yashUndzshFühren Sie hier Unterstützungsschwimmer durch:

$ echo "$((1.2 / 3))"
0.4

nurksh93(direkt) undzshBibliothek mathfunc wird hier geladen:

$ echo "$((4*atan(1)))"
3.14159265358979324

( zshmuss geladen werden zmodload zsh/mathfunc, um Funktionen wie zu erhalten atan).


Interaktiv mit zsh:

$ autoload zcalc
$ zcalc
1> PI/2
1.5708
2> cos($1)
6.12323e-17
3> :sci 12
6.12323399574e-17

Mit (t)csh (nur Integer):

% @ a=25 / 3; echo $a
8

In der rcShell-Familie akangaist dies die mit arithmetischer Erweiterung:

; echo $:25/3
8

POSIX-Werkzeugkasten

bc(Interaktiver Modus siehe unten),Handbuch hier

Eselsbrücke: best calculator (obwohl das beigentlich fürBasic).

$ echo 20+5/2 | bc
22
$ echo 'scale=4;20+5/2' | bc
22.5000

(unterstützt Zahlen mit beliebiger Genauigkeit)


BC-Interaktiver Modus:

$ bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
5+5
10

2.2+3.3
5.5

Eilen's Lösung,expr(kein interaktiver Modus):

$ expr 20 + 5
25
$ expr 20 + 5 / 2
22

Joshuas Lösung:awk(kein interaktiver Modus):

$ calc() { awk "BEGIN{print $*}"; }
$ calc 1/3
0.333333

Andere mehr oder weniger tragbare Werkzeuge

Arcege's Lösung,dc(interaktiver Modus: dc):

Das macht noch mehr Spaß, da es mit der umgekehrten polnischen Notation funktioniert.

$ echo 20 5 2 / + p | dc 
22
$ echo 4 k 20 5 2 / + p | dc 
22.5000

Aber nicht so praktisch, es sei denn, Sie arbeiten viel mit der umgekehrten polnischen Notation.

Beachten Sie, dass es dcälter ist bcund bchistorisch als Wrapper implementiert wurde dc, aber dcnicht von POSIX standardisiert wurde


DQdims'Scalc(erforderlich sudo apt-get install apcalc):

$ calc 2 + 4
6

Allgemeine Sprachdolmetscher:

Mann bei der Arbeit's Lösung,node(Interaktiver Modus: node; Ausgabefunktion nicht erforderlich):

$ node -pe 20+5/2  # Uses the power of JavaScript, e.g. : node -pe 20+5/Math.PI
22.5

Perl(interaktiver Modus: perl -de 1):

$ perl -E "say 20+5/2"
22.5

Python(Interaktiver Modus: python; Ausgabefunktion nicht erforderlich):

$ python -c "print(20+5/2)"
22 # 22.5 with python3
$ python -c "print(20+5/2.0)"
22.5

Unterstützt auch Zahlen mit beliebiger Genauigkeit:

$ python -c 'print(2**1234)'
295811224608098629060044695716103590786339687135372992239556207050657350796238924261053837248378050186443647759070955993120820899330381760937027212482840944941362110665443775183495726811929203861182015218323892077355983393191208928867652655993602487903113708549402668624521100611794270340232766099317098048887493809023127398253860618772619035009883272941129544640111837184

Wenn Sie habenclispinstalliert ist, können Sie auch die polnische Notation verwenden:

$ clisp -x "(+ 2 2)"

Marco's Lösung,lua(interaktiver Modus: lua):

$ lua -e "print(20+5/2)"
22.5

PHP(interaktiver Modus: php -a):

$ php -r 'echo 20+5/2;'
22.5

Rubin(Interaktiver Modus: irb; Ausgabefunktion nicht erforderlich):

$ ruby -e 'p 20+5/2'
22
$ ruby -e 'p 20+5/2.0'
22.5

List(interaktiver Modus: guile):

$ guile -c '(display (+ 20 (/ 5 2)))'
45/2
$ guile -c '(display (+ 20 (/ 5 2.0)))'
22.5

Slang(interaktiver Modus: slshAusgabefunktion nicht erforderlich, nur ein ;Terminator):

$ slsh -e 'printf("%f",20+5/2)'
22.000000
$ slsh -e 'printf("%f",20+5/2.0)'
22.500000

Tcl(Interaktiver Modus: tclshAusgabefunktion nicht erforderlich, aber exprvorhanden):

$ tclsh <<< 'puts [expr 20+5/2]'
22
$ tclsh <<< 'puts [expr 20+5/2.0]'
22.5

JavascriptMuscheln:

$ smjs
js> 25/3
8.333333333333334
js>

$ jspl
JSC: 25/3

RP: 8.33333333333333
RJS: [object Number]
JSC:
Good bye...

$ node
> 25/3
8.333333333333334
>

Verschiedene SQLs:

SQLite(interaktiver Modus: sqlite3):

$ sqlite3 <<< 'select 20+5/2;'
22
$ sqlite3 <<< 'select 20+5/2.0;'
22.5

MySQL:

mysql -BNe 'select 1+1'

PostgreSQL:

psql -tAc 'select 1+1

_Die Optionen für MySQL und Postgres stoppen das „ASCII-Art“-Bild!

Fachsprachen mit mathematischer Ausrichtung:

Rim einfachen Modus - generieren wir 1000 normale Zufallszahlen, ermitteln die Standardabweichung und drucken sie aus

$ R -q -e 'print(sd(rnorm(1000)))'
> print(sd(rnorm(1000)))
[1] 1.031997

RVerwendung derkleinerSkript - lasst uns Pi im Quadrat drucken

$ r -e 'cat(pi^2, "\n")'
9.869604
$  r -e 'print(sum(1:100))'
[1] 5050

PARI/GP, ein umfangreiches Computer-Algebra-System für Zahlentheorie, lineare Algebra und viele andere Dinge

$ echo "prime(1000)"|gp -q
7919                        // the 1000th prime
$ echo "factor(1000)" | gp -q
[2 3]
[5 3]                       // 2^3*5^3
$ echo "sum(x=1,5,x)" | gp -q
15                          // 1+2+3+4+5

GNU Octave(eine interpretierte Sprache auf höherem Niveau, die hauptsächlich für numerische Berechnungen gedacht ist)

Unterstützt auch komplexe Zahlen:

$ octave
>> 1.2 / 7
ans =  0.17143
>> sqrt(-1)
ans =  0 + 1i

Julia, Hochleistungssprache und Interpreter für wissenschaftliches und numerisches Rechnen.

Nicht-interaktive Option:

$ julia -E '2.5+3.7'
6.2

GhostScript GhostScript ist ein PostScript-Interpreter, der selbst in sehr alten Distributionen sehr häufig installiert ist.
SiehePostScript-Dokumentefür eine Liste der unterstützten Mathematikbefehle.

Interaktives Beispiel:

$ GS_DEVICE=display gs
GPL Ghostscript 9.07 (2013-02-14)
Copyright (C) 2012 Artifex Software, Inc.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
GS>5 2 div 20 add  =
22.5
GS>

Antwort2

Es gibt viele Möglichkeiten zur Berechnung. Für einfache Ausdrücke können Sie bashsich selbst verwenden:

echo $((20+5))

oder expr:

expr 20 + 5

Und für komplexe Fälle gibt es ein großartiges Tool bc:

echo "20+5" | bc

Übrigens kann bc sogar sehr komplexe Ausdrücke mit Wurzeln, Logarithmen, Cosinus, Sinus usw. berechnen.

Antwort3

Hat noch niemand awk erwähnt?

Definieren Sie mithilfe von POSIX-Shell-Funktionen und der Rechenleistung von awk einfach diese (einzeilige) Funktion:

calc(){ awk "BEGIN { print $*}"; }

Führen Sie dann einfach Dinge aus wie calc 1+1odercalc 5/2

Hinweis: Um die Funktion immer verfügbar zu machen, fügen Sie sie zu ~/.bashrc (oder der Startdatei Ihrer entsprechenden Shell) hinzu.

Natürlich ein kleines Skript namens "calc" mit folgendem Inhalt:

#!/bin/sh -
awk "BEGIN { print $* }"

könnte auch klappen.

Antwort4

Sie können Folgendes verwenden calc:

Wenn Sie einfach calcohne weitere Argumente eingeben, wird ein interaktiver Modus aktiviert, in dem Sie einfach weiterrechnen können. Sie beenden diesen Modus, indem Sie exit eingeben:

C-style arbitrary precision calculator (version 2.12.3.3)
Calc is open software. For license details type:  help copyright
[Type "exit" to exit, or "help" for help.]

; 2+4
6
; 3+5
8
; 3.4+5
8.4
; 2^4
16
; exit

Oder Sie verwenden es mit dem Ausdruck als Argument. Es liefert die Antwort und beendet dann den Vorgang.

$calc 2 + 4
    6
$

calcist ähnlich wie bc, mir gefällt nur die Art und Weise, wie es sich als Standard verhält, besser

verwandte Informationen