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

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

При буквальном использовании echo "20+5"получается текст " 20+5".

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

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

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

решение1

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

Краткое содержание

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

Подробности

Ракушки

Вы можете использовать арифметическое расширение 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-инструментарий

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

Мнемоника: best calculator (хотя 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

Торопитьсярешение,expr(без интерактивного режима):

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

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

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

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

Арсежрешение,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'scalc(необходимый 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 -de 1):

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

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

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

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

Хитрость(интерактивный режим: guile):

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

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

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

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

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

Яваскриптснаряды:

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

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

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

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

риспользуяменьшескрипт - давайте напечатаем пи в квадрате

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

ПАРИ/ГП, обширная система компьютерной алгебры для теории чисел, линейной алгебры и многого другого

$ 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
>> 1.2 / 7
ans =  0.17143
>> sqrt(-1)
ans =  0 + 1i

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

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

$ julia -E '2.5+3.7'
6.2

GhostScript GhostScript — это интерпретатор PostScript, который очень часто устанавливается даже в очень старых дистрибутивах.
См.Документы PostScriptдля получения списка поддерживаемых математических команд.

Интерактивный пример:

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

решение2

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

echo $((20+5))

или expr:

expr 20 + 5

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

echo "20+5" | bc

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

решение3

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

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

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

Затем просто выполните что-то вроде calc 1+1илиcalc 5/2

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

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

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

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

решение4

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

Связанный контент