Как сделать целое число и amp; расчеты поплавка, в bash или других языках /рамках?

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

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

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

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

238 голосов | спросил Michael Durrant 14 J0000006Europe/Moscow 2012, 18:43:35

16 ответов


318

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

Резюме

$ echo "$ ((20.0 /7))" # (ksh93 /zsh /yash, not bash)
$ awk "BEGIN {print (20 + 5) /2}"
$ zcalc
$ bc <20 + 5/2
$ bc <"шкала = 4; (20 + 5) /2"
$ dc <"4 k 20 5 + 2 /p"
$ expr 20 + 5
$ calc 2 + 4
$ node -pe 20 + 5/2 # Использует силу JavaScript, например. : node -pe 20 + 5 /Math.PI
$ echo 20 5 2 /+ p | Округ Колумбия
$ echo 4 k 20 5 2 /+ p | Округ Колумбия
$ perl -E "говорят 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 '(отображение (+ 20 (/5 2)))'
$ guile -c '(отображение (+ 20 (/5 2.0)))'
$ slsh -e 'printf ("% f", 20 + 5/2)'
$ slsh -e 'printf ("% f", 20 + 5 /2.0)'
$ tclsh <'помещает [expr 20 + 5/2]'
$ tclsh <'помещает [expr 20 + 5 /2.0]'
$ sqlite3 <'выберите 20 + 5/2;'
$ sqlite3 <'выберите 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 (сумма (1: 100))'
$ smjs
$ jspl

Подробнее

Раковины

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

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

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

$ echo "$ ((1.2 /3))"
0,4
$ echo "$ ((4 * atan (1)))"
+3,14159265358979324

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


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

$ autoload zcalc
$ zcalc
1 > ПИ /2
1,5708
2 > соз ($ 1)
6.12323e-17
3 > : sci 12
6.12323399574e-17

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

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

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

; эхо $: 25/3
8

POSIX toolchest

bc (см. ниже интерактивный режим), здесь

Мнемоника: b est c alculator (хотя b на самом деле для basic ).

$ echo 20 + 5/2 | До нашей эры
22
$ echo 'scale = 4; 20 + 5/2' | До нашей эры
22,5000

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


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

$ bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
Это бесплатное программное обеспечение с абсолютно БЕСПЛАТНОЙ ГАРАНТИЕЙ.
Подробнее см. «Гарантия».
5 + 5
10

2,2 + 3,3
5,5

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

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

решение Joshua : awk (без интерактивного режима)

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

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

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

Это еще более забавно, так как оно работает с помощью реверсивного нотного обозначения.

$ echo 20 5 2 /+ p | Округ Колумбия
22
$ echo 4 k 20 5 2 /+ p | Округ Колумбия
22,5000

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

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


DQdims calc (требуется < код> sudo apt-get install apcalc):

$ calc 2 + 4
6

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

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

$ node -pe 20 + 5/2 # Использует мощь JavaScript, например. : 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 с python3
$ python -c "print (20 + 5 /2.0)"
22,5

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

$ Â python -c'Печать (2 ** 1234)'
295811224608098629060044695716103590786339687135372992239556207050657350796238924261053837248378050186443647759070955993120820899330381760937027212482840944941362110665443775183495726811929203861182015218323892077355983393191208928867652655993602487903113708549402668624521100611794270340232766099317098048887493809023127398253860618772619035009883272941129544640111837184

Если у вас установлен 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 '(отображение (+ 20 (/5 2)))'
45/2
$ guile -c '(отображение (+ 20 (/5 2.0)))'
22,5

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

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

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

$ tclsh <<'помещает [expr 20 + 5/2]'
22
$ tclsh <'помещает [expr 20 + 5 /2.0]'
22,5

Рамки Javascript :

$ smjs
JS > 25/3
+8,333333333333334
JS >

$ jspl
АО: 25/3

RP: 8.33333333333333
RJS: [номер объекта]
АО:
Прощай...

$ node
> 25/3
+8,333333333333334
>

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

SQLite (интерактивный режим: sqlite3):

$ sqlite3 <<'выберите 20 + 5/2;'
22
$ sqlite3 <'выберите 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)))'
> печать (сд (RNorm (1000)))
[1] 1.031997

R , используя скрипт littler - позволяет печатать pi squared

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

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

$ echo "prime (1000)" | gp -q
7919 //1000-е правое
$ 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

Julia , высокопроизводительный язык и интерпретатор для научных и вычислительных вычислений.

Неинтерактивный вариант:

$ julia -E '2.5 + 3.7'
6,2
ответил Kuba Štaubr 29 AM00000090000005831 2013, 09:57:58
31

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

echo $ ((20 + 5))

или expr:

expr 20 + 5

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

echo "20 + 5" | До нашей эры

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

ответил rush 14 J0000006Europe/Moscow 2012, 18:47:49
22

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

# без пробелов expr 20 + 5 производит буквально 20 + 5
expr 20 + 5
â † '20 + 5

Результат # bc не дает дробную часть по умолчанию
bc <9.0 /2.0
â † '4

# expr делает только целое число
expr 9/2
â † '4

# одинаково для арифметического расширения POSIX
echo $ ((9/2))
â † '4

# bash арифметические расширительные дроссели на поплавках
echo $ ((9.0 /2.0))
â † 'bash: 9 /2.0: синтаксическая ошибка: недействительный арифметический оператор (токен ошибки «.0»)

# Большинство реализаций `expr` также имеют проблемы с поплавками
expr 9.0 /2.0
â † 'expr: нецелый аргумент

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

Вот почему я всегда использую язык сценариев, например 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
ответил Marco 14 J0000006Europe/Moscow 2012, 19:55:23
20

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

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

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

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

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

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

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

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

ответил Joshua 15 J0000006Europe/Moscow 2012, 22:30:50
17

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

$ echo "25 + 5" | До нашей эры
30

Альтернативно bc <25 + 5.

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

$ bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
Это бесплатное программное обеспечение с абсолютно БЕСПЛАТНОЙ ГАРАНТИЕЙ.
Подробнее см. «Гарантия».
25 + 5
30

Реализация GNU bc печатает эту информацию заголовка /авторского права при запуске, когда и его stdin, и stdout идут на терминал. Вы можете отключить его с помощью опции (-q. Для получения дополнительной информации см. справочная страница bc

ответил Levon 14 J0000006Europe/Moscow 2012, 18:46:19
16

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

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

Калькулятор произвольной точности C-стиля (версия 2.12.3.3)
Calc - открытое программное обеспечение. Для получения информации о лицензии введите: help copyright
[Введите «exit» для выхода или «help» для получения помощи.]

; 2 + 4
6
; 3 + 5
8
; 3,4 + 5
8,4
; 2 ^ 4
16
; Выход

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

$ calc 2 + 4
    6
$

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

ответил KennyPeanuts 14 J0000006Europe/Moscow 2012, 21:20:14
10

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

ответил asmeurer 15 J0000006Europe/Moscow 2012, 01:03:33
10

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

$ units "1 + 1"
        Определение: 2
$ единиц "1 фунт" "кг"
        * 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
ответил Random832 15 J0000006Europe/Moscow 2012, 21:40:54
6
$ > ghc -e '20 + 5 '
25
it :: Integer

Также ghci, то есть Компилятор Glasgow-Haskell в интерактивном режиме (ghc --interactive), в отличие от него, оценивая выражение с помощью ответил ДМИТРИЙ МАЛИКОВ 15 J0000006Europe/Moscow 2012, 11:05:40

4

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

$ pc '[i ** 2 для i в диапазоне (10)]'
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

сценарий:

#! /USR /местные /бен /python3

import sys
импортная трассировка
из импорта кодовой копии CommandCompiler

compile = CommandCompiler ()
filename = "<input>"
source = '' .join (sys.argv [1:]) + '\ n'

пытаться:
    code = compile (source, filename)
кроме (OverflowError, SyntaxError, ValueError):
    type, value, sys.last_traceback = sys.exc_info ()
    sys.last_type = type
    sys.last_value = значение
    если имя файла и тип - SyntaxError:
        # Трудно записать правильное имя файла в исключении
        пытаться:
            msg, (dummy_filename, lineno, offset, line) = value.args
        кроме ValueError:
            # Не формат, который мы ожидаем; забудь об этом
            проходить
        еще:
            # Материал в правом имени файла
            value = SyntaxError (msg, (filename, lineno, offset, line))
            sys.last_value = значение
    lines = traceback.format_exception_only (тип, значение)
    печать ( ''. присоединиться (строки))
еще:
    если код:
        Exec (код)
    еще:
        печать ( «неполные»)

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

ответил cobbal 18 J0000006Europe/Moscow 2012, 05:46:50
4

Gnuplot

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

echo "pr 20 + 5/2" | gnuplot # Lazy-note `pr` вместо печати
22 # Целочисленный расчет & результат
эхо "пр 20. + 5/2" | gnuplot # Lazy-note `pr` вместо печати
22.0 # Результат с плавающей запятой
echo "pr sin (2 * pi /3.)" | gnuplot # Некоторые функции ...
+0,866025403784439

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

  

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

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

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

echo "20 + 5/2" | root -l
(const int) 22
эхо "20 + 5/2". | root -l
(const double) 2.25000000000000000e + 01

echo "cout <20 + 5/2 <endl;" | root -l
22
ответил Hastur 11 J0000006Europe/Moscow 2014, 02:58:48
4

Для целочисленной арифметики (где 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 -s4 10/3
  • zsh * echo $ ((10./3))

*: и ksh93, yash

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

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


Примечания

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

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

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

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

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

функция calc
    awk "BEGIN {print $ argv}";
конец
ответил ndemou 20 PMpMon, 20 Apr 2015 19:07:26 +030007Monday 2015, 19:07:26
3

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

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

ответил killermist 15 J0000006Europe/Moscow 2012, 00:33:00
3

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

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

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

echo 25 + 5 | R --vanilla

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

ответил user unknown 15 J0000006Europe/Moscow 2012, 01:52:11
3

SQLite

echo 'select 1 + 1;' | sqlite3

MySQL

mysql -e 'выбрать 1 + 1 из dual;'

PostgreSQL

psql -c 'выбрать 1 + 1 в качестве суммы;'
ответил Vidul 16 J0000006Europe/Moscow 2012, 18:38:24
2

Используйте многоадресную арифметическую библиотеку 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 /вводное выражение
  • Добавьте псевдоним для удобства использования; например alias calcf = 'run-expr -f' для оценки с плавающей точкой

Вывод:

# calcf '2/3'
"2/3" base 0: результат 0.666666666666666666667e0

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

Использование: ./run-expr [-z] [-q] [-f] [-p prec] [-b base] выражение ...

   Оцените каждый аргумент как простое выражение. По умолчанию это находится в mpz
   целые числа, но -q выбирает mpq или -f, выбирает mpf. Для mpf поплавок
   точность может быть задана с помощью -p. Во всех случаях входная база может быть установлена
   с -b, или по умолчанию «0» означает десятичное значение с допустимым «0x».

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

ответил のbるしtyぱんky 26 FebruaryEurope/MoscowbWed, 26 Feb 2014 15:27:28 +0400000000pmWed, 26 Feb 2014 15:27:28 +040014 2014, 15:27:28

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132