GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie werden Integer- und Float-Berechnungen in Bash oder anderen Sprachen/Frameworks durchgeführt?

Mit echo "20+5" erzeugt buchstäblich den Text „20+5 „.

Welchen Befehl kann ich verwenden, um die numerische Summe zu erhalten, 25 in diesem Fall?

Außerdem, was ist der einfachste Weg, es einfach mit Bash als Fließkomma
zu machen? Beispiel:echo $((3224/3807.0)) gibt aus :(.

Ich suche nach Antworten, indem ich entweder die grundlegende Befehlsshell („Befehlszeile“) selbst verwende oder Sprachen verwende, die über die
Befehlszeile verfügbar sind.

Akzeptierte Antwort:

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

Schalen

Sie können die POSIX-Arithmetikerweiterung für Integer verwenden arithmetisch echo "$((...))" :

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

Ziemlich portabel (ash dash yash bash ksh93 lksh zsh ):
Mit der printf-Fähigkeit zum Drucken von Gleitkommazahlen können wir die meisten Shells erweitern, um Gleitkomma-Mathematik zu machen, wenn auch mit einem begrenzten Bereich (nicht mehr als 10 Ziffern):

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

ksh93 , yash und zsh Unterstützen Sie Floats hier:

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

nur ksh93 (direkt) und zsh Bibliothek mathfunc hier laden:

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

(zsh müssen zmodload zsh/mathfunc laden um Funktionen wie atan zu erhalten ).

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 Ganzzahl):

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

Im rc Muschelfamilie, akanga ist die mit arithmetischer Erweiterung:

; echo $:25/3
8

POSIX-Werkzeugkiste

bc (siehe unten für den interaktiven Modus), Anleitung hier

Mnemonik:b est c Rechner (obwohl der b steht eigentlich für basic ).

$ 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

Rushs 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 Tools

Lösung von Arcege, dc (interaktiver Modus:dc ):

Was noch mehr Spaß macht, da es mit umgekehrter polnischer 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 umgekehrter polnischer Notation.

Verwandte:Den Wert einer Variablen in Bash in Anführungszeichen setzen oder nicht?

calc von DQdims (erforderlich sudo apt-get install apcalc) :

$ calc 2 + 4
6

Universalsprachdolmetscher:

Lösung von manatwork, node (interaktiver Modus:node; Ausgabefunktion nicht benötigt):

$ 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 benötigt):

$ 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 clisp haben installiert, können Sie auch die polnische Schreibweise verwenden:

$ clisp -x "(+ 2 2)"

Marcos 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 benötigt):

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

Güte (interaktiver Modus:guile ):

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

S-Sprache (interaktiver Modus:slsh; Ausgabefunktion wird nicht benötigt, 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:tclsh; Ausgabefunktion wird nicht benötigt, aber expr ist):

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

Javascript Muscheln:

$ 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 auf mysql und postgres stoppen das Bild „ascii art“ !

Mathematisch orientierte Spezialsprachen:

R im einfachen Modus – generieren wir 1000 normale Zufallszahlen und erhalten die Standardabweichung und drucken sie

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

R mit dem Little Skript – lässt Pi im Quadrat drucken

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

PARI/GP , ein umfangreiches Computeralgebrasystem für Zahlentheorie, lineare Algebra und vieles mehr

$ 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 hochrangige interpretierte Sprache, 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 häufig selbst in sehr alten Distributionen installiert wird.
Siehe PostScript-Dokumentation für eine Liste der unterstützten mathematischen Befehle.

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>

Linux
  1. Wie debuggt man ein Bash-Skript?

  2. Wie man einen Knall wiederholt!?

  3. So echoen Sie eine neue Zeile in Bash-Shell-Skripten

  4. Wie teste ich, ob eine Variable in Bash eine Zahl ist?

  5. Wie kann ich die letzte Zahl von String in Bash bekommen?

So kommentieren Sie in Bash

So verwenden Sie den Echo-Befehl in Bash-Skripten unter Linux

So führen Sie ein Bash-Skript aus

Wie Echo in Datei

Wie kann ich überprüfen, ob eine Datei in einem bestimmten Verzeichnis in einem Bash-Skript vorhanden ist?

Wie teilt man eine Zeichenfolge mit Anführungszeichen (wie Befehlsargumente) in Bash auf?