Как выполнять вычисления integer & float в bash или других языках / фреймах?

Использование echo "20+5" буквально выдает текст « 20+5 ».

Какую команду я могу использовать для получения числовой суммы, 25 в этом случае?

Кроме того, что это самый простой способ сделать это, просто используя bash для с плавающей запятой? Например, echo $((3224/3807.0)) печатает 0 :(.

Я ищу ответы, используя либо основную командную оболочку (сама «командная строка»), либо используя языки, доступные из командной строки.

Есть много вариантов !!!

Резюме

 $ echo "$((20.0/7))" # (ksh93/zsh/yash, not 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, eg : 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 

Детали

ракушки

Вы можете использовать арифметическое расширение POSIX для целочисленного арифметического echo "$((...))" :

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

ksh93 , ksh93 и zsh поддерживают там поплавки:

 $ echo "$((1.2 / 3))" 0.4 $ echo "$((4*atan(1)))" 3.14159265358979324 

zsh вам нужно zmodload zsh/mathfunc для получения математических функций, таких как atan выше, yash не поддерживает их).


Интерактивно с zsh:

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

С (t) csh (только целое число):

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

В семействе rc оболочек akanga является арифметическим расширением:

 ; echo $:25/3 8 

POSIX toolchest

bc (см. ниже интерактивный режим): Мнемоника: b est c alculator (хотя b фактически является базовым ).

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

(поддерживает произвольные номера точности)


bc интерактивный режим:

 $ 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 

Решение Rush , expr (без интерактивного режима):

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

Решение Джошуа : awk (нет интерактивного режима):

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

Другие более или менее переносные инструменты

Решение Arcege , dc (интерактивный режим: dc ток ):

Это еще более увлекательно, так как оно работает с помощью обратной полировки.

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

Но не так практично, если вы не работаете с реверсивным нотным обозначением.

Обратите внимание, что dc предшествует bc а bc исторически реализован как обертка вокруг dc но dc не был стандартизован POSIX


Вычисление DQdims (требуется sudo apt-get install apcalc) :

 $ calc 2 + 4 6 

Устные переводчики общего назначения:

решение manatwork , node (интерактивный режим: node , функция вывода не требуется):

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

Perl (интерактивный режим: perl -de 1 ):

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

Python (интерактивный режим: python , функция вывода не требуется):

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

Также поддерживает произвольные номера точности:

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

Если у вас установлен clisp , вы также можете использовать нотную clisp :

 $ clisp -x "(+ 2 2)" 

Решение Marco , lua (интерактивный режим: lua ):

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

PHP (интерактивный режим: php -a ):

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

Ruby (интерактивный режим: irb ; функция вывода не требуется):

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

Guile (интерактивный режим: guile ):

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

S-Lang (интерактивный режим: slsh ; функция вывода не требуется, просто a ; terminator):

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

Tcl (интерактивный режим: tclsh ; функция вывода не требуется, но expr is):

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

Оболочки Javascript :

 $ 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 > 

Различные SQL-запросы:

SQLite (интерактивный режим: 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 

Опции для mysql и postgres останавливают изображение «ascii art»!

Специализированные ориентированные на математику языки:

R в обычном режиме – позволяет генерировать 1000 обычных случайных чисел и получать стандартное отклонение и печатать

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

R с использованием сценария littler – позволяет печатать pi-квадрат

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

PARI / GP , обширная система компьютерной алгебры для теории чисел, линейная алгебра и многое другое

 $ 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 (высокоуровневый интерпретируемый язык, в основном предназначенный для численных вычислений)

Также поддерживает комплексные номера:

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

Существует множество способов расчета. Для простых выражений вы можете использовать bash :

 echo $((20+5)) 

или expr :

 expr 20 + 5 

А для сложных случаев есть отличный инструмент bc :

 echo "20+5" | bc 

Btw, bc может вычислять даже очень сложное выражение с корнями, логарифмами, cos, sin и т. Д.

Указанные решения хороши для очень простых вычислений, но очень подвержены ошибкам. Примеры:

 # without spaces expr 20+5 produces literally 20+5 expr 20+5 → 20+5 # bc's result doesn't give the fractional part by default bc <<< 9.0/2.0 → 4 # expr does only integer expr 9 / 2 → 4 # same for POSIX arithmetic expansion echo $((9/2)) → 4 # bash arithmetic expansion chokes on floats echo $((9.0/2.0)) → bash: 9/2.0: syntax error: invalid arithmetic operator (error token is ".0") # Most `expr` implementations also have problems with floats expr 9.0 / 2.0 → expr: non-integer argument 

Синтаксическую ошибку, такую ​​как последние, легко заметить, но целочисленные ответы с отброшенной частью с плавающей запятой могут легко остаться незамеченными и привести к неправильным результатам.

Вот почему я всегда использую язык сценариев, например Lua. Но вы можете выбрать любой язык сценариев, с которым вы знакомы. Я просто использую Lua в качестве примера. Преимущества

  • знакомый синтаксис
  • знакомые функции
  • знакомые оговорки
  • гибкий ввод
  • пространства обычно не имеют значения
  • вывод с плавающей точкой

Примеры:

 lua -e "print(9/2)" → 4.5 lua -e "print(9 / 2)" → 4.5 lua -e "print(9.0/2)" → 4.5 lua -e "print (9 /2.)" → 4.5 lua -e "print(math.sqrt(9))" → 3 

Никто еще не упомянул awk?

Используя функции оболочки POSIX и математическую мощность awk, просто определите эту (одну строку) функцию:

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

Затем просто выполните такие вещи, как calc 1+1 или calc 5/2

Примечание. Чтобы функция всегда была доступна, добавьте ее в ~ / .bashrc (или в файл запуска вашего соответствующего shell)

Конечно, маленький скрипт под названием «calc» со следующим содержимым:

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

может также работать.

Вы можете использовать bc . Например,

 $ echo "25 + 5" | bc 30 

В качестве альтернативы также будет работать bc <<< 25+5 .

Или в интерактивном режиме, если вы хотите сделать больше, чем просто один простой расчет:

 $ 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'. 25 + 5 30 

bc -q переходит в bc без информации заголовка / авторского права. Для получения дополнительной информации см. Справочную страницу bc

На этой странице также показано, как настроить псевдоним или функцию для расчета следующим образом:

 c "25 + 5" 

и получить результат

Вы можете использовать calc :

Если вы просто вводите calc без каких-либо других аргументов, он переходит в интерактивный режим, где вы можете просто продолжать математику. Выходите из этого, набрав exit:

 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 

Или вы используете его с выражением в качестве аргумента, и он предоставит ответ, а затем выйдет

 $calc 2 + 4 6 $ 

calc похож на bc , мне просто нравится, как он работает по умолчанию лучше

Мне нравится запускать Python и использовать его в качестве интерактивного калькулятора (но опять же, я программист на Python).

Поскольку никто не упомянул об этом, и хотя это не совсем калькулятор (но не все эти языки общего назначения для сценариев), я хотел бы упомянуть units :

 $ units "1 + 1" Definition: 2 $ units "1 lb" "kg" * 0.45359237 / 2.2046226 

Или, для меньшего объема вывода, чтобы вы могли получить только число, которое нужно использовать в $() чтобы присвоить что-то:

 $ units -t "1 + 1" 2 $ units -t "1 lb" "kg" 0.4539237 

И это даже делает температурные преобразования

 $ units -t "tempC(20)" "tempF" 68 

Чтобы получить преобразование температуры в выражении для дальнейшего расчета, сделайте следующее:

 $ units -t "~tempF(tempC(20))+1" 68.1 
 $> ghc -e '20 + 5' 25 it :: Integer 

Также ghci , то есть компилятор Glasgow-Haskell в интерактивном режиме ( ghc --interactive , в отличие от него, оценивающий выражение с -e ), делает увлекательный «калькулятор»:

 $>ghci GHCi, version 7.8.3: http://www.haskell.org/ghc/ :? for help Loading package ghc-prim ... linking ... done. Loading package integer-gmp ... linking ... done. Loading package base ... linking ... done. Prelude> pi 3.141592653589793 Prelude> ceiling pi 4 Prelude> compare 1 2 LT 

Я использую небольшой скрипт python, который будет оценивать выражение python и печатать результат, тогда я могу запускать что-то вроде

 $ pc '[i ** 2 for i in range(10)]' [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] 

сценарий:

 #!/usr/local/bin/python3 import sys import traceback from codeop import CommandCompiler compile = CommandCompiler() filename = "<input>" source = ' '.join(sys.argv[1:]) + '\n' try: code = compile(source, filename) except (OverflowError, SyntaxError, ValueError): type, value, sys.last_traceback = sys.exc_info() sys.last_type = type sys.last_value = value if filename and type is SyntaxError: # Work hard to stuff the correct filename in the exception try: msg, (dummy_filename, lineno, offset, line) = value.args except ValueError: # Not the format we expect; leave it alone pass else: # Stuff in the right filename value = SyntaxError(msg, (filename, lineno, offset, line)) sys.last_value = value lines = traceback.format_exception_only(type, value) print(''.join(lines)) else: if code: exec(code) else: print('incomplete') 

К сожалению, я не помню, откуда я взял большую часть кода, поэтому не могу его привести.

Gnuplot

gnuplot – интерактивная программа построения графиков
Следуйте приведенной выше ссылке или введите gnuplot из приглашения, а затем обратитесь в интерпретатор gnuplot .
Gnuplot – это программа, созданная для построения данных, но также может использоваться для расчета. Это дает преимущество в том, что вы можете определять функции и использовать встроенные.

 echo "pr 20+5/2" | gnuplot # Lazy-note `pr` instead of print 22 # Integer calculation & result echo "pr 20.+5/2" | gnuplot # Lazy-note `pr` instead of print 22.0 # Floating point result echo "pr sin(2*pi/3.)" | gnuplot # Some functions ... 0.866025403784439 

Корень (или какой-либо другой интерпретатор языка C )

Система ROOT предоставляет набор инфраструктур OO со всеми функциями, необходимыми для эффективного и эффективного анализа больших объемов данных …

Вы можете использовать его как C-интерпретатор , CINT , или вы можете использовать один из многих других интерпретаторов C. ИМХО, он огромный, сложный, мощный и не всегда дружелюбный, но может также дать большое удовлетворение.

Если вы действительно не хотите слушать маленький голос внутри вас, который цитирует Confucio, и вы готовы сломать (масло) на колесе, вы можете использовать корень . В этом случае -l обязательно избегать отображения заставки …

 echo "20+5/2" | root -l (const int)22 echo "20+5/2." | root -l (const double)2.25000000000000000e+01 echo "cout<< 20+5/2 << endl;" | root -l 22 

Для консольных вычислений я использую concalc . ( sudo aptitude install concalc )

После этого просто введите concalc и нажмите enter. Он не будет предоставлять подсказку, но просто введите ваш расчет (без пробелов) и нажмите enter, а на следующей строке он даст вам числовое значение.

Я не могу поверить, что я читал «силу JavaScript» (но мне пришлось переложить ответ на другие части, за исключением, конечно, perl.

Практически для простых случаев, когда достаточно целочисленной арифметики, я использую buildin $ ((…)) и рекомендую его. Иначе, почти во всех случаях эхо «…» | bc достаточно.

Для некоторых арифметических операций, таких как статистика, операции с матрицами и многое другое R – лучший инструмент:

 echo 25 + 5 | R --vanilla 

а для небольших наборов данных и графического oocalc результатов, oocalc – хорошая утилита.

SQLite :

 echo 'select 1 + 1;' | sqlite3 

MySQL :

 mysql -e 'select 1 + 1 from dual;' 

PostgreSQL :

 psql -c 'select 1 + 1 as sum;' 

Для целочисленной арифметики (где 3/2 = 1)

  • bash echo $(( 1+1 ))
  • fish math 1+1
  • zsh* echo $((1+1))

*: и ksh93, yash

Для арифметики с плавающей запятой (где 3/2 = 1,5)

  • bash awk "BEGIN {print 10/3}" (низкая точность)
  • bash echo "10/3"|bc -l (высокая точность)
  • fish math "scale=4; 10/3"
  • zsh* echo $((10./3))

*: и ksh93, yash

Вы можете, конечно, настроить свою оболочку на использование awk с минимальным набором текста, например, calc 10/3 (см. Примечания о том, как это сделать для bash 1 и fish 2 ).

Основная причина предлагать awk для bash состоит в том, что он предварительно установлен почти на всех Unix-подобных операционных системах и достаточно легкий (конечно, стоит начать процесс) с менее точным, но более удобным для пользователя выходом, чем bc -l который печатает 20 десятичных цифр (хотя вы можете, конечно, настроить awk, чтобы получить больше десятичных цифр ).


Заметки

(1) Как использовать упрощенный синтаксис в bash

Добавьте эту функцию bash к вашему ~/.bashrc :

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

(2) Как использовать упрощенный синтаксис в рыбе

Создайте функцию calc рыбы (например, текстовый файл с именем /home/ndemou/.config/fish/functions/calc.fish ):

 function calc awk "BEGIN{ print $argv }" ; end 

Используйте библиотеку многоточечной арифметики GNU через прилагаемую программу run-expr :

  • Загрузите и извлеките (вам понадобится lzip): tar -xvf gmp-5.1.3.tar.lz
  • В верхнем каталоге, ./configure и make (нет необходимости устанавливать)
  • В demos / expr make run-expr
  • Мне нравится создавать символическую ссылку на него в моем каталоге ~/bin : ln -s /path/to/gmp/demos/expr/run-expr ~/bin/run-expr
  • Добавьте псевдоним для удобства использования; например, alias calcf='run-expr -f' для оценки с плавающей запятой

Вывод:

 # calcf '2/3' "2/3" base 0: result 0.666666666666666666667e0 

Из файла run-expr.c :

 Usage: ./run-expr [-z] [-q] [-f] [-p prec] [-b base] expression... Evaluate each argument as a simple expression. By default this is in mpz integers, but -q selects mpq or -f selects mpf. For mpf the float precision can be set with -p. In all cases the input base can be set with -b, or the default is "0" meaning decimal with "0x" allowed. 

См. Руководство по различиям и деталям классов функций.