Użycie echo "20+5"
dosłownie tworzy tekst „ 20+5
”.
Jakiego polecenia mogę użyć 25
w tym przypadku do uzyskania sumy liczbowej ?
Jaki jest najłatwiejszy sposób, aby to zrobić, używając bash jako zmiennoprzecinkowego? Na przykład echo $((3224/3807.0))
drukuje 0
:(.
Szukam odpowiedzi za pomocą samej podstawowej powłoki poleceń („wiersza polecenia”) lub za pomocą języków dostępnych z wiersza poleceń.
shell
command-line
arithmetic
floating-point
calculator
Michael Durrant
źródło
źródło
bc
, może warto poświęcić chwilę, aby przeczytać o-l
opcji na stronie podręcznika.Odpowiedzi:
Istnieje wiele opcji !!!
Podsumowanie
Detale
Muszle
Można użyć POSIX arytmetyczną ekspansję na całkowitą arytmetycznych
echo "$((...))"
:Dość przenośny (
ash dash yash bash ksh93 lksh zsh
):Używając zdolności printf do drukowania liczb zmiennoprzecinkowych, możemy rozszerzyć większość powłok, aby wykonać matematykę zmiennoprzecinkową, aczkolwiek z ograniczonym zasięgiem (nie więcej niż 10 cyfr):
ksh93
,yash
izsh
czy wsparcie pływa tutaj:tylko
ksh93
(bezpośrednio) izsh
ładowanie biblioteki mathfunc tutaj:(
zsh
trzeba załadować,zmodload zsh/mathfunc
aby uzyskać funkcje takie jakatan
).Interaktywnie z zsh:
Z (t) csh (tylko liczba całkowita):
W
rc
rodzinie powłokakanga
jest ten z rozszerzeniem arytmetycznym:Zestaw narzędzi POSIX
bc
(patrz poniżej tryb interaktywny), instrukcja tutajMnemonic: best calculator (choć
b
tak naprawdę jest podstawowy ).(obsługuje dowolne liczby precyzji)
tryb interaktywny bc:
Rozwiązanie Rusha
expr
(brak trybu interaktywnego):Rozwiązanie Jozuego :
awk
(brak trybu interaktywnego):Inne mniej lub bardziej przenośne narzędzia
Arcege rozwiązaniem jest,
dc
(tryb interaktywny:dc
):Co jest jeszcze przyjemniejsze, ponieważ działa w odwrotnej notacji polskiej.
Ale nie tak praktyczne, chyba że dużo pracujesz z odwrotną notacją polską.
Zauważ, że
dc
poprzedzabc
ibc
była historycznie implementowana jako opakowanie,dc
aledc
nie była standaryzowana przez POSIXDQdims 's
calc
(wymaganesudo apt-get install apcalc)
:Tłumacze językowi ogólnego przeznaczenia:
rozwiązanie manatwork ,
node
(tryb interaktywny :;node
funkcja wyjścia nie jest wymagana):Perl (tryb interaktywny:)
perl -de 1
:Python (tryb interaktywny
python
:; funkcja wyjściowa nie jest wymagana):Obsługuje również dowolne liczby precyzji:
Jeśli masz
clisp
zainstalowany, możesz także użyć polskiej notacji:Rozwiązanie Marco ,
lua
(tryb interaktywny:)lua
:PHP (tryb interaktywny:)
php -a
:Ruby (tryb interaktywny
irb
:; funkcja wyjściowa nie jest wymagana):Guile (tryb interaktywny :)
guile
:S-Lang (tryb interaktywny
slsh
:; funkcja wyjściowa nie jest wymagana, tylko;
terminator):Tcl (tryb interaktywny :;
tclsh
funkcja wyjściowa nie jest wymagana, aleexpr
jest):Skorupy JavaScript :
Różne SQL:
SQLite (tryb interaktywny:)
sqlite3
:MySQL :
PostgreSQL :
_Opcje w mysql i postgres zatrzymują obraz „ascii art”!
Specjalistyczne języki matematyczne:
R w trybie zwykłym - pozwala wygenerować 1000 normalnych liczb losowych, uzyskać standardowe odchylenie i wydrukować go
R za pomocą skryptu Littler - pozwala wydrukować pi do kwadratu
PARI / GP , rozbudowany system algebry komputerowej do teorii liczb, algebry liniowej i wielu innych rzeczy
GNU Octave (język interpretacji wysokiego poziomu, przeznaczony głównie do obliczeń numerycznych)
Obsługuje również liczby zespolone:
Julia , wysokowydajny język i tłumacz dla obliczeń naukowych i numerycznych.
Opcja nieinteraktywna:
źródło
whatis bc
->An arbitrary precision calculator language
Ciekawe! Dzięki!dc
, co jest jeszcze bardziej zabawne, ponieważ działa w odwrotnej notacji polskiej.echo 20 5 + p | dc
Ale nie tak praktyczne, chyba że dużo pracujesz z odwrotną notacją polską.## Command line calculator calc () { bc -l <<< "$@" }
math
wbudowanym (lub jak to się teraz nazywa) w trakcie rozmowy. Możesz edytować. To nie moja odpowiedź i to wiki społeczności.Istnieje wiele sposobów obliczania. W przypadku prostych wyrażeń możesz użyć
bash
samego:lub
expr
:A w przypadku skomplikowanych przypadków istnieje świetne narzędzie
bc
:Btw, bc może obliczyć nawet bardzo złożone wyrażenie z pierwiastkami, logarytmami, cos, sin i tak dalej.
źródło
expr
opcję do zaakceptowanej odpowiedzi. Musiałem wybrać jeden do zaakceptowania i scentralizowania.expr 20+5
. Trzeba wpisać spacji między numerami i Plus, aby to działało:expr 20 + 5
. To jest ważne.Wspomniane rozwiązania nadają się do bardzo prostych obliczeń, ale są bardzo podatne na błędy. Przykłady:
Łatwo zauważalny jest błąd składniowy, podobnie jak ostatnie, ale odpowiedzi całkowite z odrzuconą częścią zmiennoprzecinkową mogą łatwo zostać niezauważone i prowadzić do błędnych wyników.
Dlatego zawsze używam do tego języka skryptowego takiego jak Lua. Możesz jednak wybrać dowolny język skryptowy, który znasz. Po prostu używam Lua jako przykładu. Zalety są
Przykłady:
źródło
bc
„s wynik nie jest liczbą całkowitą, to w zaokrągleniu doscale
, kto jest wartość domyślna to 0. Więcbc <<< 'scale=4;9.0/2.0'
jeśli chcesz część ułamkową.scale
jeśli użyjębc
za kilka tygodni? Prawdopodobnie nie. I nawet jeśli istnieje sposób, aby to zmienić na stałe, ugryzie cię, jeśli masz system z ustawieniami domyślnymi.scale
od czasu, gdy poznałem siębc
po raz pierwszy lata temu. Ale zawsze zapomniałem, czy funkcją wyjściowąlua
jestput
czyputs
. ;)bc -l
zamiast zwykłegobc
, a potem nie martw sięscale
.Nikt jeszcze nie wspomniał o awk?
Używając funkcji powłoki POSIX i mocy matematyki awk, po prostu zdefiniuj tę funkcję (jedna linia):
Następnie po prostu wykonaj takie rzeczy jak
calc 1+1
lubcalc 5/2
Uwaga: Aby funkcja była zawsze dostępna, dodaj ją do ~ / .bashrc (lub pliku startowego odpowiedniej powłoki)
Oczywiście mały skrypt o nazwie „calc” o następującej treści:
może również działać.
źródło
a=0; b=0.0; if echo "$a" "$b" | awk '{ exit ($1 == $2) ? 0 : 1 }'; then echo 'equals'; else echo 'not equals'; fi
Możesz użyć
bc
. Na przykład,Alternatywnie
bc <<< 25+5
będzie również działać.Lub interaktywnie, jeśli chcesz zrobić coś więcej niż tylko jedno proste obliczenie:
Implementacja GNU
bc
drukuje te nagłówki / informacje o prawach autorskich podczas uruchamiania, gdy zarówno jego stdin, jak i stdout idą do terminala. Możesz go wyłączyć za pomocą opcji (specyficznej dla GNU)-q
. Aby uzyskać więcej informacji, zobacz stronę manuala bcźródło
ctrl-d
wyjść?quit
c () { bc -l <<< "$@" }
zdefiniuje funkcjęc
do szybkiego i łatwego użycia. np.c 3/2
da ci1.50000000000000000000
. Link powyżej opisujący jak to zrobić jest martwy.Możesz użyć
calc
:Jeśli po prostu wejdziesz
calc
bez żadnych argumentów, wejdzie w tryb interaktywny, w którym możesz po prostu robić matematykę. Wyjdź z tego, wpisując polecenie exit:Lub użyjesz go z wyrażeniem jako argumentem, który dostarczy odpowiedź, a następnie zakończy działanie
calc
jest podobny dobc
, po prostu podoba mi się sposób, w jaki lepiej się zachowuje jako domyślnyźródło
calc -e '2+4; 3+5; 3.4+5; 2^4
drukuje 4 linie wyjściowe lub po prostucalc -e 33+(3^3)
.. +1 Podoba mi się pomysł użycia kalkulatora zwanego „calc” :)-e
opcja nie jest potrzebna, gdy istnieje tylko jedno wyrażenie ... schludne! ..Lubię odpalać Python i używać go jako interaktywnego kalkulatora (ale z drugiej strony jestem programistą Python).
źródło
screen
uruchomionym Pythonie.Ponieważ nikt o tym nie wspominał i chociaż nie jest to wyłącznie kalkulator (ale nie wszystkie te języki skryptowe ogólnego przeznaczenia), chciałbym wspomnieć
units
:Lub, aby uzyskać mniej danych wyjściowych, abyś mógł uzyskać tylko numer, który będzie używany
$()
do przypisania do czegoś:I nawet dokonuje konwersji temperatury
Aby uzyskać konwersję temperatury w wyrażeniu do dalszych obliczeń, wykonaj następujące czynności:
źródło
Ponadto
ghci
, to jest kompilator Glasgow-Haskell w trybie interaktywnym (ghc --interactive
w przeciwieństwie do oceny wyrażenia za pomocą-e
), tworzy fascynujący „kalkulator”:źródło
ghc
oznacza kompilator Glasgow Haskell?Nie mogę uwierzyć, że czytam „moc JavaScript” (ale musiałem głosować za odpowiedzią na inne części, z wyjątkiem oczywiście perla.
Praktycznie w prostych przypadkach, w których wystarczająca jest arytmetyka liczb całkowitych, używam buildin $ ((...)) i polecam go. W przeciwnym razie w prawie wszystkich przypadkach echo „...” | bc jest wystarczające.
W przypadku niektórych operacji arytmetycznych, takich jak statystyki, operacje macierzowe itp
R
., Lepszym narzędziem jest:a dla małych zestawów danych i graficznych wyników wyrzucania
oocalc
jest dobrym narzędziem.źródło
Używam małego skryptu Pythona, który oceni wyrażenie w Pythonie i wydrukuje wynik, a następnie mogę uruchomić coś takiego
skrypt jest:
Niestety nie pamiętam, skąd pożyczyłem większość kodu, więc nie mogę go zacytować.
źródło
print(eval(' '.join(sys.argv[1:])))
zrobiłby tego samego?Gnuplot
gnuplot - interaktywny program do rysowania
Kliknij powyższy link lub wpisz
gnuplot
zapytanie, a następniehelp
winterpretera gnuplot .Gnuplot jest programem stworzonym do drukowania danych, ale można go również wykorzystać do obliczeń. Daje to tę zaletę, że można definiować funkcje i / lub korzystać z wbudowanych.
Root (lub inny interpreter języka C )
Można go używać jako C tłumacza , CInt , lub użyć jednego z wielu, wielu innych tłumaczy C . IMHO, jest ogromny, złożony, potężny i nie zawsze przyjazny, ale może też dać dużą satysfakcję.
Jeśli naprawdę nie chcesz słuchać małego głosu w swoim wnętrzu, który cytuje Confucio, i jesteś gotowy złamać muchę (masło) na kole , możesz użyć korzenia . W takim przypadku
-l
należy bezwzględnie unikać wyświetlania ekranu powitalnego ...źródło
Dla arytmetyki liczb całkowitych (gdzie 3/2 = 1)
bash
echo $(( 1+1 ))
fish
math 1+1
zsh*
echo $((1+1))
*: i ksh93, yash
Dla arytmetyki zmiennoprzecinkowej (gdzie 3/2 = 1,5)
bash
awk "BEGIN {print 10/3}"
(niska precyzja)bash
echo "10/3"|bc -l
(wysoka precyzja)fish
math -s4 10/3
zsh*
echo $((10./3))
*: i ksh93, yash
Możesz oczywiście skonfigurować swoją powłokę, aby używała awk przy minimalnym pisaniu jak
calc 10/3
(patrz uwagi na temat tego, jak to zrobić dla bash 1 i fish 2 ).Głównym powodem sugerowania awk dla bash jest to, że jest on zainstalowany fabrycznie na prawie wszystkich systemach uniksopodobnych i jest dość lekki (oczywiście wiąże się to z kosztem uruchomienia procesu) z mniej precyzyjnym, ale bardziej przyjaznym dla człowieka wyjściem, niż
bc -l
który drukuje 20 miejsc po przecinku cyfry (chociaż z pewnością możesz dostosować awk, aby uzyskać więcej cyfr dziesiętnych ).Notatki
(1) Jak korzystać z uproszczonej składni w bash
Dodaj tę funkcję bash do
~/.bashrc
:(2) Jak korzystać z uproszczonej składni u ryb
Utwórz funkcję
calc
ryb (tj. Plik tekstowy o nazwie/home/ndemou/.config/fish/functions/calc.fish
):źródło
awk
użyjedouble
typu zmiennoprzecinkowego twojego systemu , więc będzie tak precyzyjny, jak większość innych narzędzi, które nie wykonują dowolnej precyzji (zauważ, że gawk może wykonywać dowolną precyzję).awk
używaOFMT
zmiennej do konwertowania liczby na ich ciąg reprezentujący dane wyjściowe (%.6g
domyślnie możesz to zmienić, aby%.17g
uzyskać większą precyzję ).fish
jestmath
to tylko funkcja, która wymagabc
(choć to zmienić )bc
. Nie ma już w nowszych wersjach, w których takie rzeczymath "scale=4; 10/3"
już nie będą działać (math -s4 10/3
zamiast tego teraz)math -s4
wydaje się być obsługiwana również w starszych wersjach)Używam do obliczeń konsolowych
concalc
. (sudo aptitude install concalc
)Następnie wystarczy wpisać
concalc
i nacisnąć Enter. Nie wyświetli monitu, ale po prostu wpisz swoje obliczenia (bez spacji) i naciśnij klawisz Enter, a w następnym wierszu podana zostanie wartość liczbowa.źródło
SQLite :
MySQL :
PostgreSQL :
źródło
from dual
jest potrzebnych Oracle, MySQL jest w stanieselect
bezfrom
klauzuli. 2) PostgreSQL nie wymaga aliasu. 3);
Jest wymagany tylko przez SQLite. 4) MySQL i PostgreSQL będą działać tylko wtedy, gdy będą mogły połączyć się z serwerem bazy danych. 5) MySQL i PostgreSQL narysują tabelę ASCII-art wokół wyników. Aby uzyskać tylko wartość:mysql -BNe 'select 1+1'
ipsql -tAc 'select 1+1
.Użyj biblioteki arytmetycznej wielokrotnej precyzji GNU za pośrednictwem dostarczonego
run-expr
programu:tar -xvf gmp-5.1.3.tar.lz
./configure
imake
(nie trzeba instalować)make run-expr
~/bin
katalogu:ln -s /path/to/gmp/demos/expr/run-expr ~/bin/run-expr
alias calcf='run-expr -f'
do oceny zmiennoprzecinkowejWynik:
Z
run-expr.c
pliku:Patrz instrukcja różnic klas i szczegółów.
źródło