Разработчик (и) | Роберт Моррис и Лоринда Черри из Bell Labs, Филип А. Нельсон |
---|---|
Первый выпуск | 1975, 44–45 лет назад |
Операционная система | Unix, Unix -подобно, Plan 9, FreeDOS |
Platform | Cross-Platform |
Тип | Command |
bcдля базового калькулятора (часто называемого стендом Calculator), является «языком калькулятора произвольной точности » с синтаксисом, аналогичным языку программирования C. bc обычно используется как язык математических сценариев или как интерактивная математическая оболочка.
Типичным интерактивным использованием является ввод команды bc
в командной строке Unix и ввод математического выражения, например (1 + 3) * 2
, после чего 8будет выведено. Хотя bc может работать с произвольной точностью, на самом деле по умолчанию он принимает нулевые цифры после десятичной точки, поэтому выражение 2/3
дает 0. Это может удивить новых пользователей bc, не знающих об этом факте. Параметр -l
для bc устанавливает масштаб по умолчанию (цифры после десятичной точки) на 20 и добавляет в язык несколько дополнительных математических функций.
bc впервые появилась в версии 6 Unix в 1975 году и была написана Робертом Моррисом и Лориндой Черри из Bell Labs. bc предшествовал dc, более ранний калькулятор произвольной точности, написанный теми же авторами. dc мог выполнять вычисления произвольной точности, но его синтаксис обратной польской нотации (RPN) - очень любимый многими для вычисления алгебраических формул - оказался неудобным для его пользователей при выражении управления потоком, и поэтому bc был написан как интерфейс к dc. bc был очень простым компилятором (единственный исходный файл yacc с несколькими сотнями строк), который преобразовывал новый, подобный C синтаксис bc в постфиксную нотацию dc и передал результаты через dc.
В 1991 году POSIX строго определен и стандартизирован bc. Три реализации этого стандарта выживают и сегодня: первая - это традиционная реализация Unix, интерфейс для dc, которая сохранилась в системах Unix и Plan 9. Вторая - это бесплатное программное обеспечение GNU bc, впервые выпущенное в 1991 году Филипом А. Нельсоном. Реализация GNU имеет множество расширений, выходящих за рамки стандарта POSIX, и больше не является интерфейсом для dc (это интерпретатор байт-кода ). Третий - это повторная реализация OpenBSD в 2003 году.
Стандартизованный POSIX язык bc традиционно записывается как программа на dc язык программирования, обеспечивающий более высокий уровень доступа к функциям языка dc без сложностей краткого синтаксиса dc.
В этой форме язык bc содержит однобуквенные имена переменных, массивов и функций и большинство стандартных арифметических операторов, а также знакомые конструкции control-flow (if (cond ) ...
, while (cond ) ...
и для (init ; cond ; inc ) ...
) из C. В отличие от C, за предложением if
не может следовать else
.
Функции определяются с использованием ключевого слова define
, а значения возвращается из них с помощью return
, за которым следует возвращаемое значение в круглых скобках. Ключевое слово auto
(необязательно в C) используется для объявления переменной как локальной для функции.
Все числа и содержимое переменных являются числами произвольной точности, точность которых (в десятичных разрядах) определяется глобальной переменной scale
.
числовая база ввода (в интерактивном режиме), выходные данные и программные константы могут быть указаны путем установки зарезервированной базы
(входная база) и переменные obase
(выходная база).
Выходные данные генерируются, если результат вычислений не присваивается переменной.
Комментарии могут быть добавлены к коду bc с использованием символов C /*
и */
(начало и конец комментария).
Следующие операторы POSIX bc ведут себя точно так же, как их аналоги в C:
+ - * / + = - = * = / = ++ - <>==! = <=>= () [] {}
Модуль Операторы, %
и % =
ведут себя точно так же, как их аналоги в C, только если для глобальной переменной scale
установлено значение 0, т.е. все вычисления производятся только для целых чисел. В противном случае расчет выполняется с соответствующим масштабом. a% b
определяется как a- (a / b) * b
. Примеры:
$ bc bc 1.06 Авторские права 1991–1994, 1997, 1998, 2000 Free Software Foundation, Inc. Это бесплатное программное обеспечение, на которое не распространяется АБСОЛЮТНО БЕЗ ГАРАНТИЙ. Для получения подробной информации введите «гарантия». масштаб = 0; 5% 3 2 шкала = 1; 5% 3.2 масштаб = 20; 5% 3.00000000000000000002
Операторы
^ ^ =
внешне напоминают побитовые операторы C исключающее ИЛИ, но фактически являются операторами возведения в степень bc.
Особо следует отметить, что использование оператора ^
с отрицательными числами не соответствует приоритету оператора C. -2 ^ 2
дает ответ 4 под bc, а не −4.
Битовые , логические и условные операторы :
| ^ || = | = ^ = = || = <<>><<=>>=?:
недоступны в POSIX bc.
Функция sqrt()
для вычисления квадратных корней является единственной встроенной функцией POSIX bc. математическая функция. Другие функции доступны во внешней стандартной библиотеке.
Функция scale()
для определения точности (как с переменной scale
) своего аргумента и также встроена функция length()
для определения количества значащих десятичных цифр в аргументе.
Стандартная математическая библиотека bc (определенная с помощью параметра -l ) содержит функции для вычисления синуса, косинуса, арктангенс, натуральный логарифм, экспоненциальная функция и двухпараметрическая функция Бесселя J. С их помощью можно построить большинство стандартных математических функций (включая другие обратные тригонометрические функции). См. Внешние ссылки для реализации многих других функций.
команда bc | Функция | Описание |
---|---|---|
s (x) | Sine | Принимает x, угол в радианах |
c (x) | Косинус | Принимает x, угол в радианах |
a (x) | Арктангенс | Возвращает радианы |
l (x) | Натуральный логарифм | |
e (x) | Экспоненциальная функция | |
j (n, x) | Функция Бесселя | Возвращает функцию Бесселя порядка n для x. |
Параметр -l изменяет масштаб на 20, поэтому такие вещи, как модуль по модулю, могут работать неожиданно. Например, запись bc -l
, а затем команда print 3% 2
выводит 0. Но запись scale = 0
после bc -l
, а затем команда print 3% 2
выведет 1.
Plan 9 bc идентичен POSIX bc, но для дополнительного напечатайте
заявление.
GNU bc является производным от стандарта POSIX и включает множество улучшений. Он полностью отделен от реализаций стандарта POSIX на основе dc и написан на C. Тем не менее, он полностью обратно совместим, поскольку все программы POSIX bc будут работать без изменений как программы GNU bc.
Переменные GNU bc, массивы и имена функций могут содержать более одного символа, некоторые другие операторы были включены из C, и, в частности, за предложением if
может следовать else
.
Вывод достигается либо путем намеренного отказа от присвоения результата вычисления переменной (способ POSIX), либо с помощью добавленного оператора print
.
Кроме того, оператор read
позволяет интерактивный ввод числа в текущее вычисление.
В дополнение к комментариям в стиле C, символ #
заставит игнорировать все, что находится после него, до следующей новой строки.
Значение последнего вычисления всегда сохраняется в дополнительной встроенной переменной last
.
Следующие логические операторы являются дополнительными к таковым в POSIX bc:
|| !
Они доступны для использования в условных операторах (например, в операторе if
). Обратите внимание, однако, что по-прежнему нет эквивалентных побитовых операций или операций присваивания.
Все функции, доступные в GNU bc, унаследованы от POSIX. Никаких дополнительных функций в стандартной комплектации GNU не предусмотрено.
Поскольку оператор bc ^
допускает только целочисленную степень справа от него, одна из первых функций, которые может написать пользователь bc, - это степенная функция с показатель с плавающей запятой. Оба приведенных ниже предполагают, что стандартная библиотека была включена:
/ * Функция, возвращающая целую часть x * / define i (x) {auto ss = scale scale = 0 x / = 1 / * округлить x вниз * / scale = s return (x)} / * Использовать тот факт, что x ^ y == e ^ (y * log (x)) * / define p ( x, y) {if (y == i (y)) {return (x ^ y)} return (e (y * l (x)))}
Вычислите pi, используя встроенную функцию arctangent, a ():
$ bc -lq scale = 10000 4 * a (1) # Атан 1 равен 45 градусам, что равно пи / 4 в радианах. # Расчет может занять несколько минут.
Поскольку синтаксис bc аналогичен синтаксису C, опубликованные числовые функции, написанные на C, часто могут быть довольно легко переведены в bc, что сразу обеспечивает произвольная точность bc. Например, в Journal of Statistical Software (июль 2004 г., том 11, выпуск 5) Джордж Марсалья опубликовал следующий код C для кумулятивного нормального распределения :
двойной фи (двойной x) {длинный двойной s = x, t = 0, b = x, q = x * x, i = 1; в то время как (s! = t) s = (t = s) + (b * = q / (i + = 2)); возврат.5 + s * exp (-. 5 * q-.91893853320467274178L); }
С некоторыми необходимыми изменениями для приспособления к другому синтаксису bc и пониманием того, что константа «0.9189...» на самом деле является log (2 * PI) / 2, это можно преобразовать в следующий код GNU bc:
определить phi (x) {auto s, t, b, q, i, const s = x; t = 0; б = х; д = х * х; i = 1, а (s! = t) s = (t = s) + (b * = q / (i + = 2)) const = 0,5 * l (8 * a (1)) # 0,91893... return. 5 + s * e (-. 5 * q-const)}
bc можно использовать не интерактивно, с вводом через канал pipe. Это полезно внутри сценариев оболочки. Например:
$ result = $ (echo "scale = 2; 5 * 7/3;" | bc) $ echo $ result 11.66
Напротив, обратите внимание, что только оболочка bash выполняет целочисленную арифметику, например:
$ result = $ ((5 * 7/3)) $ echo $ result 11
Можно также использовать идиому здесь-строка (в bash, ksh, csh):
$ bc -l <<< "5*7/3" 11.66666666666666666666
Викибук Руководство по Unix имеет страницу по теме: Команды |