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


295

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

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

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

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


1
Если вы собираетесь bc, возможно, стоит прочитать об этой -lопции на странице руководства.
Гленн Джекман

Я предполагаю, что автор запрашивает командную строку bash, в то время как все ответы имеют тенденцию диверсифицироваться на все виды языков сценариев.
Зынь

2
man bash → / выражение
ДМИТРИЙ МАЛИКОВ

1
@zinking Ну, bash разработан так, чтобы было удобно легко вызывать интерпретаторы для большого количества других скриптовых языков.
Random832

Научите целочисленное деление в bash с результатами с плавающей запятой: stackoverflow.com/a/24431665/3776858
Сайрус

Ответы:


399

Вариантов много !!!

Резюме

$ printf %.10f\\n "$((10**9 * 20/7))e-9"   # many shells. Not mksh.
$ 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, 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

подробности

ракушки

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

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

Довольно переносимый ( ash dash yash bash ksh93 lksh zsh):
используя возможность printf для печати плавающих чисел, мы можем расширить большинство оболочек для выполнения математических операций с плавающей точкой, хотя и с ограниченным диапазоном (не более 10 цифр):

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

ksh93, yashи zshсделать поддержку плавает здесь:

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

только ksh93(напрямую) и zshзагрузка библиотеки mathfunc здесь:

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

( zshнеобходимо загрузить, zmodload zsh/mathfuncчтобы получить функции, как atan).


Интерактивно с 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(см. ниже для интерактивного режима), руководство здесь

Mnemonic: best calculator (хотя на bсамом деле он базовый ).

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

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


Интерактивный режим до н.э .:

$ 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 «s calc(требуется sudo apt-get install apcalc):

$ calc 2 + 4
6

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

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

$ node -pe 20+5/2  # Uses the power of JavaScript, e.g. : 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 -x "(+ 2 2)"

Решение Марко , 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функция вывода не нужна, только ;терминатор):

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

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

$ 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, используя скрипт Литтлера - позволяет напечатать число в квадрате

$ 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

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

Неинтерактивная опция:

$ julia -E '2.5+3.7'
6.2

3
а бк интересно: whatis bc-> An arbitrary precision calculator language интересно! Спасибо!
Майкл Даррант

@MichaelDurrant, не могли бы вы пересмотреть свои изменения, я должен был отклонить по ошибке?
lgarzo

4
Существует также dc, что еще более увлекательно, так как он работает по обратной польской записи. echo 20 5 + p | dc Но не так практично, если вы не много работаете с обратной польской нотацией.
Arcege

2
В качестве варианта подхода bc я добавил следующую функцию (которую я нашел где-то в stackexchange) в мой файл .bashrc. Я могу просто ввести calc 2 + 3 и получить 5. ## Command line calculator calc () { bc -l <<< "$@" }
Джо

1
@ Крис, рыба - движущаяся цель. mathПока мы говорим, они работают над своим новым встроенным (или как он там сейчас называется). Не стесняйтесь редактировать. Это не мой ответ, а вики сообщества.
Стефан

35

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

echo $((20+5))

или expr:

expr 20 + 5

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

echo "20+5" | bc

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


Я добавил ваш exprвариант в принятый ответ. Пришлось выбрать один, чтобы принять и централизовать.
Майкл Даррант

3
Вы пытаетесь казнить expr 20+5. Вам необходимо ввести пробел между числами и плюс , чтобы сделать его работу: expr 20 + 5. Это важно
Раш

24

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

# 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

2
bcрезультат не является целым числом, просто округляется до scaleзначения по умолчанию, равного 0. Так что, bc <<< 'scale=4;9.0/2.0'если вы хотите дробную часть.
manatwork

Спасибо за исправление. Но все же, это подвержено ошибкам. Запомню, добавлю scaleли я bcчерез пару недель? Возможно нет. И даже если есть способ изменить его навсегда, он укусит вас, если вы используете систему с настройками по умолчанию.
Марко

3
Лично я помню о том, scaleкак я встретился bcвпервые много лет назад. Но я всегда забыл ли выход функция luaявляется putили puts. ;)
manatwork

Просто посчитайте bc одним из языков сценариев. Я всегда знаю, нужны ли мне целочисленные результаты или нет - если целое число в порядке, я остаюсь в bash, иначе у меня редко есть причина использовать bc. Для lua вы должны помнить -e, печатать и ставить скобки.
пользователь неизвестен

7
Просто всегда используйте, bc -lа не просто bc, тогда никогда не беспокойтесь scale.
Dalker

23

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

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

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

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

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

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

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

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


2
Ух ты как лучше, даже поддерживает поплавки. Работает без установки ничего!
CMCDragonkai

1
Очень хорошо, я хотел провести плавное сравнение, вот как я сделал это с вашей помощью:a=0; b=0.0; if echo "$a" "$b" | awk '{ exit ($1 == $2) ? 0 : 1 }'; then echo 'equals'; else echo 'not equals'; fi
Пол Тобиас

18

Вы могли бы использовать 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

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


1
+1 для параметров канала ("|") и интерактивного режима для bs. Есть ли ctrl-dвыход?
Майкл Даррант

1
@MichaelDurrant Да, ^ D будет добиваться цели, как и будетquit
Левон

c () { bc -l <<< "$@" } определит функцию c для быстрого и удобного использования. например c 3/2, даст вам 1.50000000000000000000. Ссылка в приведенном выше описании, как это сделать, мертва.
Иосиф

1
@ Levon ссылка на справочную страницу все еще работает. Тем не менее, появляется ссылка: paweng.com/2008/08/15/unix-command-line-calculator , которую вы указываете как цель "This" в предложении "Эта страница также показывает, как настроить псевдоним ...". мертвый.
Иосиф

1
@ijoseph Спасибо .. Я удалил ссылку на эту 6-летнюю ссылку (хотел бы, чтобы ссылки выделялись в моем браузере более четко - даже не видел ее, когда я смотрел вчера)
Левон

16

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

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

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, мне просто нравится, как он ведет себя по умолчанию лучше


1
Вам не нужно входить в интерактивный режим, если только вы не хотите этого, например: calc -e '2+4; 3+5; 3.4+5; 2^4печатать 4 выходные строки или просто calc -e 33+(3^3).. +1 Мне нравится идея использовать что-то под названием «calc» для калькулятора :)
Peter.O

1
Я только что понял, что -eопция не нужна, когда есть только одно выражение ... аккуратно! ..
Peter.O

10

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


я тоже! Питон - мой швейцарский армейский нож
Левон

У меня всегда есть одно окно screenтолько при запуске Python.
Arcege

1
pythonpy ( github.com/russell91/pythonpy ) - хороший способ сделать это и другие вещи в синтаксисе python без
запуска

Мне нравится python, но время запуска становится важным, если вы просто хотите добавить два числа в нескольких местах вашего bash-скрипта
ndemou

@ndemou я сказал "интерактивный" калькулятор. Хотя также стоит отметить, что в какой-то момент, если вы делаете достаточно сложные вещи в скрипте, здравомыслие требует от вас использования чего-то другого, кроме bash (например, Python).
asmeurer

10

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

Есть так много опций, которые не требуют установки дополнительной программы, поэтому я не понимаю, почему так хочется.
ndemou

@ndemou Он установлен по умолчанию в некоторых дистрибутивах ... и многие другие ответы - нет. И вам действительно нужно было прокомментировать этот ответ, которому пять лет?
Random832

1
Я думаю, что хорошо комментировать, когда я голосую против, и эта практика также поощряется SE. Я не понимаю, почему пять лет имеют значение. Тот же комментарий относится ко всем аналогичным ответам - ничего личного. (Кстати, даже самую непонятную программу можно установить по умолчанию в некоторых дистрибутивах. В этом случае я протестировал последние установки Debian, Ubuntu, CentOS и RedHat, а модулей нет)
ndemou

6
$> ghc -e '20 + 5'
25
it :: Integer

Кроме того ghci, это компилятор Глазго-Хаскелла в интерактивном режиме ( 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

3
Означает ли это ghcГлазго Компилятор Haskell?
Манатворк

принимая программу, мне нужно установить, но спасибо.
Майкл Даррант

4

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

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

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

echo 25 + 5 | R --vanilla

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


4

Я использую небольшой скрипт 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')

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


не print(eval(' '.join(sys.argv[1:])))сделал бы то же самое?
g.rocket

Вы используете молоток, чтобы ударить муху здесь
ndemou

4

Gnuplot

gnuplot - интерактивная программа построения графиков.
Перейдите по указанной выше ссылке или введитеgnuplotформу приглашения, а затемhelpвинтерпретаторе 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

Root (или другой интерпретатор C )

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

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

Если вы действительно не хотите слушать тихий голос внутри себя, который цитирует Конфуцио, и вы готовы разбить (сливочное масло) мушку на колесе, вы можете использовать root . В этом случае -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

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-подобных ОС и является достаточно легким (конечно, это стоит затрат на запуск процесса) с менее точным, но более удобным для пользователя выводом, чем тот, bc -lкоторый печатает 20 десятичных знаков. цифры (хотя вы можете, конечно, настроить awk, чтобы получить больше десятичных цифр ).


Примечания

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

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

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

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

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

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

awkбудет использовать doubleтип с плавающей запятой в вашей системе , поэтому он будет таким же точным, как и большинство других инструментов, которые не имеют произвольной точности (обратите внимание, что gawk может делать произвольную точность). awkиспользует OFMTпеременную для преобразования числа в их строковое представление для вывода ( %.6gпо умолчанию вы можете изменить его на %.17gболее высокую точность ).
Стефан

Обратите внимание , что fish«s mathэто просто функция , которая вызывает bc(хотя это изменить )
Stéphane Chazelas

1
Ну, это была функция, которая вызывает bc. Это больше не в новых версиях, где такие вещи math "scale=4; 10/3"больше не будут работать ( math -s4 10/3вместо этого сейчас)
Стефан

Спасибо Стефану Шазеласу - я обновил свой ответ ( math -s4кажется, поддерживается и в более старых версиях)
ndemou

3

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

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


3

SQLite :

echo 'select 1 + 1;' | sqlite3 

MySQL :

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

PostgreSQL :

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

3
Некоторые незначительные детали, которые стоит упомянуть: 1) from dualтребуется Oracle, MySQL может selectбез fromоговорок. 2) PostgreSQL не требует псевдонима. 3) ;Требуется только для SQLite. 4) MySQL и PostgreSQL будут работать, только если они смогут подключиться к серверу базы данных. 5) MySQL и PostgreSQL нарисуют таблицу ASCII-art вокруг результатов. Чтобы получить только значение: mysql -BNe 'select 1+1'и psql -tAc 'select 1+1.
manatwork

2

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

  • Скачайте и распакуйте (вам понадобится lzip): tar -xvf gmp-5.1.3.tar.lz
  • В верхнем каталоге ./configureи make(не нужно устанавливать)
  • В демо / 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.

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.