- Лучшие калькуляторы командной строки в Linux
- Возможности GNU bc
- Как использовать GNU bc
- Выражения типа
- База переключения ввода/вывода
- Настроить точность
- Используйте встроенные функции
- 1. Квадратный корень из N :
- 2. Синус X ( X в радианах):
- 3. Косинус X ( X в радианах):
- 4. Арктангенс X (возвращаемое значение в радианах):
- 5. Натуральный логарифм X :
- 6. Экспоненциальная функция X :
- Другие вкусности в качестве языка
- Используйте GNU bc неинтерактивно
- Заключение
- Занимательная математика командной строки
- bash калькулятор целочисленный
- bc мэдскиллз
- Замер производительности процессора с bc
- Скрипты bc
- awk: арифмометр и гадалка
- В заключение
Лучшие калькуляторы командной строки в Linux
Каждый современный дистрибутив Linux для настольных ПК поставляется с приложением калькулятора на основе графического интерфейса по умолчанию. С другой стороны, если ваше рабочее пространство заполнено окнами терминалов, и вы предпочитаете быстро обрабатывать некоторые числа в одном из этих терминалов, вы, вероятно, ищете калькулятор командной строки. В этой категории трудно превзойти GNU bc (сокращение от «базовый калькулятор»). Хотя в Linux доступно множество калькуляторов командной строки, я думаю, что GNU bc — самый мощный и полезный.
Предшествующий эпохе GNU, bc на самом деле является исторически известным языком вычислений с произвольной точностью, первая реализация которого восходит к старым дням Unix в 1970-х годах. Первоначально bc был более известен как язык программирования, синтаксис которого похож на язык C. Со временем первоначальный bc превратился в POSIX bc , а затем, наконец, в сегодняшний GNU bc .
Возможности GNU bc
Сегодняшний GNU bc является результатом множества усовершенствований более ранних реализаций bc , и теперь он входит в стандартную комплектацию всех основных дистрибутивов GNU/Linux. Он поддерживает стандартные арифметические операторы с числами произвольной точности и несколькими числовыми основаниями (например, двоичными, десятичными, шестнадцатеричными) ввода и вывода.
Если вы знакомы с языком C, то увидите, что в bc используются такие же или похожие математические операторы. Некоторые из поддерживаемых операторов включают арифметические (+, -, *, /, %, ++, —), сравнение ( , ==, !=, =), логические (!, &&, | |), побитовое (&, |, ^, ~, >), составное присваивание (+=, -=, *=, /=, %=, &=, |=, ^=, &&=, ||=, >=) операторы. bc содержит множество полезных встроенных функций, таких как вычисление квадратного корня, синуса, косинуса, арктангенса, натурального логарифма, экспоненты и т. д.
Как использовать GNU bc
В качестве калькулятора командной строки возможные варианты использования GNU bc практически безграничны. В этом уроке я собираюсь описать несколько популярных функций команды bc . Полное руководство см. в официальном источнике.
Если у вас нет предварительно написанного скрипта bc , вы обычно запускаете bc в интерактивном режиме, где любой типизированный оператор или выражение, завершающееся символом новой строки, интерпретируется и выполняется на месте. Просто введите следующее, чтобы войти в интерактивный сеанс bc . Чтобы выйти из сеанса, введите « quit » и нажмите Enter.
Примеры, представленные в оставшейся части руководства, должны быть набраны внутри сеанса bc .
Выражения типа
Чтобы вычислить арифматическое выражение, просто введите выражение рядом с мигающим курсором и нажмите ENTER . Если вы хотите, вы можете сохранить промежуточный результат в переменной, а затем получить доступ к переменной в других выражениях.
В рамках данного сеанса bc поддерживает неограниченную историю ранее введенных строк. Просто используйте клавишу со стрелкой ВВЕРХ, чтобы получить ранее введенные строки. Если вы хотите ограничить количество строк, сохраняемых в истории, назначьте это число специальной переменной с именем history . По умолчанию для переменной установлено значение -1, что означает неограниченно.
База переключения ввода/вывода
Часто требуется ввести входные выражения и отобразить результаты в двоичном или шестнадцатеричном формате. Для этого bc позволяет переключать числовую базу входных или выходных чисел. Базы ввода и вывода хранятся в ibase и obase соответственно. Значение по умолчанию для этих специальных переменных — 10, допустимые значения — от 2 до 16 (или значение переменной среды BC_BASE_MAX в случае obase ). Чтобы переключить числовую базу, все, что вам нужно сделать, это изменить значения ibase и obase . Например, вот примеры суммирования двух шестнадцатеричных/двоичных чисел:
Обратите внимание, что здесь я указываю obase=16 перед ibase=16 , а не наоборот. Это связано с тем, что если я сначала укажу ibase=16 , последующий оператор obase=16 будет интерпретирован как присвоение 16 по основанию 16 obase ( т. е. 22 в десятичной форме), а это не то, что нам нужно.
Настроить точность
В bc точность чисел хранится в специальной переменной с именем scale . Эта переменная представляет количество десятичных цифр после запятой. По умолчанию для scale установлено значение 0, что означает, что все числа и результаты усекаются/хранятся в целых числах. Чтобы настроить точность по умолчанию, все, что вам нужно сделать, это изменить значение переменной scale .
Используйте встроенные функции
Помимо простых арифметических операций, GNU bc предлагает широкий спектр расширенных математических функций, встроенных через внешнюю математическую библиотеку. Чтобы использовать эти функции, запустите bc с параметром -l из командной строки.
Некоторые из этих встроенных функций показаны здесь.
1. Квадратный корень из N :
2. Синус X ( X в радианах):
3. Косинус X ( X в радианах):
4. Арктангенс X (возвращаемое значение в радианах):
5. Натуральный логарифм X :
6. Экспоненциальная функция X :
Другие вкусности в качестве языка
Как полноценный язык калькуляторов, GNU bc поддерживает простые операторы (например, присваивание переменной, break, return), составные операторы (например, if, while, цикл for) и определения пользовательских функций. Я не буду подробно описывать эти функции, но вы можете легко узнать, как их использовать, из официального руководства. Вот очень простой пример определения функции:
define dummy(x) < return(x * x); >dummy(9) 81 dummy(4) 16
Используйте GNU bc неинтерактивно
До сих пор мы использовали bc в интерактивном сеансе. Однако довольно популярные варианты использования bc на самом деле включают запуск bc в сценарии оболочки не в интерактивном режиме. В этом случае вы можете отправить ввод в bc с помощью echo через канал. Например:
$ echo "40*5" | bc $ echo "scale=4; 10/3" | bc $ echo "obase=16; ibase=2; 11101101101100010" | bc
Заключение
В заключение, GNU bc — это мощный и универсальный калькулятор командной строки, который действительно оправдывает ваши ожидания. Предварительно загруженный во все современные дистрибутивы Linux, bc может значительно упростить выполнение задач по обработке чисел, не отходя от терминала. Кроме того, если ваш сценарий оболочки требует вычислений с плавающей запятой, bc может быть легко вызван сценарием для выполнения этой работы. В общем, GNU bc определенно должен быть в вашем наборе инструментов для повышения производительности.
Занимательная математика командной строки
Если вы пользователь Linux, Free/Open BSD или другой свободной ОС, есть вероятность, что интерфейс командной строки вам не чужд. В таком случае можно использовать командную оболочку для простых арифметических действий. Для этого не нужно устанавливать дополнительных программ, все уже есть в базовом наборе операционной системы. Они позволяют качественно заменить привычный калькулятор на столике счетовода.
bash калькулятор целочисленный
Арифметические операции с целочисленными в bash будут выглядеть так:
$((expression)) $(( n1+n2 )) $(( n1/n2 )) $(( n1*n2 )) $(( n1-n2 ))
На man странице bash , в разделе ARITHMETIC EVALUATION вы можете ознакомиться с приоритетом исполнения действий операторов. И, кстати, можно получить тот же результат, используя команду expr целочисленное выражение , вместо подстановки с двойными скобками в командах вывода.
bc мэдскиллз
Целочисленные выражения это конечно хорошо, но как-то маловато даже для калькулятора. Благо в наборе есть еще bc — Си-подобный интерактивный интерпретатор. Не будем тратить время на сложение и вычитание, перейдем сразу к более интересным занятиям.
Это уже получше калькулятора, так как позволяет получить любое количество чисел в дробной части с помощью переменной scale . Остерегайтесь поддельных проприетарных версий bc , так как они поддерживают всего-лишь 99 знаков после запятой!
$ echo 'scale=30;sqrt(2)' | bc 1.414213562373095048801688724209
Еще 2 важные переменные: ibase и obase указывают на основание входящих и исходящих чисел.
$ echo 'ibase=16;obase=A;FF' | bc 255
Тут, кстати, есть засада. Посмотрите на эти два примера. Вроде бы пытаешься сделать то же самое, но результат разный. Вся суть в том, что в первом примере ibase=2 , но сама obase=10 принимает значение 2 в силу того, что ibase определяет по базе obase и 10 становится равной 2. Чтобы разорвать этот круг, надо использовать hex.
$ echo 'ibase=2;obase=10;10' | bc 10 $ echo 'ibase=2;obase=A;10' | bc 2
При множественном возведении числа в степень важно расставить нужным образом скобки, ибо bc правоассоциативна и результат может быть не тот, на который вы рассчитывали.
$ echo '4^4^4' |bc 13407807929942597099574024998205846127479365820592393377723561443721\ 76403007354697680187429816690342769003185818648605085375388281194656\ 9946433649006084096 $ echo '(4^4)^4' |bc 4294967296
Помимо этих художеств, bc имеет еще интерактивный режим в котором пищит и все портит делает все то же самое, но уже напрямую, без конвейера. Ключ -q нужен, чтобы подавить гнушное приветствие.
$ bc -q 4^4^4 13407807929942597099574024998205846127479365820592393377723561443721\ 76403007354697680187429816690342769003185818648605085375388281194656\ 9946433649006084096 quit
Замер производительности процессора с bc
Много лун назад на одном популярном англоязычном форуме, ныне покойном, предложили гениально простой способ нагреть проц и посчитать его скорость в попугаях.
time echo "scale=5000; 4*a(1)" | bc -l -q
Мы подгружаем в bc математическую библиотеку опцией -l и просим выдать число π с точностью 5000 знаков после запятой. Мой результат вычисления на Intel(R) Core(TM) i5-4300U CPU @ 1.90GHz :
real 0m24.507s user 0m24.490s sys 0m0.000s
s (x) The sine of x, x is in radians. c (x) The cosine of x, x is in radians. a (x) The arctangent of x, arctangent returns radians. l (x) The natural logarithm of x. e (x) The exponential function of raising e to the value x. j (n,x) The Bessel function of integer order n of x.
Скрипты bc
В bc можно, если очень нужно, определять функции и запускать скрипты. Определение функции имеет следующий синтаксис:
Определены условные операторы if и else , причем последний не обязательно использовать, а также заголовки цикла for и while . На Википедии можно просмотреть список математических операторов и сравнить с таковым в Си. А вот так выглядит расчет чисел Фибоначчи в bc .
#!/usr/bin/bc -q define fibo(n) < if (x return c; > fibo(1000) quit
Как ЯП bc не взлетел, однако, в качестве настольного калькулятора он более чем хорош.
awk: арифмометр и гадалка
Мне не часто доводилось пользоваться awk , поэтому каждый раз я с удивлением обнаруживаю новые возможности этой программы. Если нужно посчитать логарифмы или синусы, не спешите паниковать, man awk вам поможет. Вот так мы получили квадратный корень.
А вот мы уже логарифмируем число π, 5000 знаков которого мы уже вычисляли с помощью bc .
Оглашаю полный список возможностей
atan2(y, x) Return the arctangent of y/x in radians. cos(expr) Return the cosine of expr, which is in radians. exp(expr) The exponential function. int(expr) Truncate to integer. log(expr) The natural logarithm function. rand() Return a random number N, between 0 and 1, such that 0 ≤ N < 1. sin(expr) Return the sine of expr, which is in radians. sqrt(expr) Return the square root of expr. srand([expr]) Use expr as the new seed for the random number generator. If no expr is provided, use the time of day. Return the previous seed for the random number generator.
Иногда, хочется довериться судьбе и послать все на три буквы — awk. Вообще-то, это пример из книги издательства O'Reilly, имитирует бросание монетки, выдавая 2 разных события пить или не пить с одинаковой вероятностью.
#!/bin/bash ans=`awk -vmin=0 -vmax=1 'BEGIN'` if [ $ans -eq 0 ]; then echo "no" else echo "yes" fi
В заключение
В нашей математической мастерской.еще очень много разных программ и если тема взлетит, попробуем перейти в первую и высшую лигу математического ПО с открытыми исходниками.
I. Замена калькулятора
- Встроенные средства командной оболочки: арифметические подстановки bash .
- Программа GNU bc .
- Неформат — awk .
- OpenOffice / LibreOffice Calc .
- KDE KSpread .
- GNOME Gnumeric .
- Одиночные, например: GNU Oleo и другие.
III. Специализированные математические программы, уровень студент+
IV. Языки программирования, математические библиотеки и среды
- Ansi C , библиотеки math.h, complex.h, GSL и другие товарищи.
- Java Scientific Library
- Python , библиотеки SciPy, NumPy, Sympy и другие товарищи.
- COBOL .
- Fortran .
- Intel Math Kernel Library (Intel MKL)
- AMD Accelerated Parallel Processing Math (APPLM)
- AMD Core Math Library (ACML)
Список, естественно не полный, поэтому заранее прошу прощение, если не указал чей-то излюбленный математический пакет или ЯП. Последняя группа — поистине разливанное море разнообразного и годного софта.
А вот и обещанный мэдскиллз вместе с ответом на вопрос из картинки. Источник.