Введение
Утилита UNIX, реализующая арифметику произвольной точности.
bc (basic calculator — базовый калькулятор) — это "язык вычислений произвольной точности" с синтаксисом, близким к языку программирования C. bc обычно используется как язык математических скриптов или как интерактивная математическая среда.
Обзор
Типичным интерактивным использованием является ввод команды `bc` в командной строке Unix и ввод математического выражения, например, `1/3`, после чего будет выведено `0`. Хотя `bc` может работать с произвольной точностью, по умолчанию он фактически устанавливает ноль знаков после десятичной точки, поэтому выражение `1/3` даёт `0` (результаты усекаются, а не округляются). Это может удивить новых пользователей, не знающих об этом. Опция `-l` для `bc` устанавливает масштаб по умолчанию (количество знаков после десятичной точки) равным 20 и добавляет несколько дополнительных математических функций в язык.
История
bc впервые появился в Unix версии 6 в 1975 году. Он был разработан Лориндой Черри из Bell Labs как интерфейс к dc, калькулятору произвольной точности, написанному Робертом Моррисом и Черри. dc выполнял вычисления произвольной точности, заданные в обратной польской нотации. bc предоставлял интерфейс обычного языка программирования к тем же возможностям посредством простого компилятора (один исходный файл yacc, состоящий из нескольких сотен строк кода), который преобразовывал синтаксис, подобный C, в нотацию dc и передавал результаты в dc. В 1991 году POSIX строго определил и стандартизировал bc. Сегодня существует три реализации этого стандарта: первая – традиционная Unix-реализация, интерфейс к dc, сохранившаяся в системах Unix и Plan 9; вторая – свободное программное обеспечение GNU bc, впервые выпущенное в 1991 году Филиппом А. Нельсоном. Реализация GNU имеет множество расширений, выходящих за рамки стандарта POSIX, и больше не является интерфейсом к dc (это интерпретатор байт-кода); третья – перереализация, выполненная OpenBSD в 2003 году.
POSIX bc
Стандартный язык bc POSIX традиционно реализуется как программа на языке dc, чтобы обеспечить более высокий уровень доступа к возможностям языка dc без сложностей его краткого синтаксиса. В этой форме язык bc содержит однобуквенные имена переменных, массивов и функций, а также большинство стандартных арифметических операторов и привычные конструкции управления потоком выполнения (if(условие), while(условие) и for(инициализация; условие; инкремент)) из языка C. В отличие от C, за оператором if не может следовать оператор else. Функции определяются с помощью ключевого слова define, а значения возвращаются из них с помощью return, за которым следует возвращаемое значение в скобках. Ключевое слово auto (необязательное в C) используется для объявления переменной как локальной для функции. Все числа и содержимое переменных – это числа произвольной точности, точность (в десятичных знаках) которых определяется глобальной переменной scale. Числовая система счисления для ввода (в интерактивном режиме), вывода и программных констант может быть задана установкой зарезервированных переменных ibase (основание системы счисления ввода) и obase (основание системы счисления вывода). Вывод генерируется путем намеренного не присваивания результата вычисления переменной. Комментарии в коде bc могут добавляться с использованием символов C /* и */ (начало и конец комментария).
Встроенные функции
Функция sqrt для вычисления квадратных корней – единственная встроенная математическая функция в POSIX bc. Другие функции доступны во внешней стандартной библиотеке. Также встроенными являются функции scale для определения точности (аналогично переменной scale) аргумента и length для определения количества значащих десятичных цифр в аргументе.
Стандартные библиотечные функции
Стандартная математическая библиотека bc (определяемая опцией l) содержит функции для вычисления синуса, косинуса, арктангента, натурального логарифма, экспоненциальной функции и двухпараметрической функции Бесселя J. Большинство стандартных математических функций (включая другие обратные тригонометрические функции) можно построить, используя эти функции. См. внешние ссылки для реализаций многих других функций. +Стандартная библиотека bcКомандаОписаниеФункции(x)СинусПринимает 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.
План 9 до н.э.
План 9 bc идентичен POSIX bc, за исключением дополнительной команды печати.
GNU bc
GNU bc берет свое начало из стандарта POSIX и включает в себя множество улучшений. Он полностью отделен от реализаций, основанных на dc, соответствующих стандарту POSIX, и написан на языке C. Тем не менее, он полностью обратно совместим: все программы POSIX bc будут работать без изменений как программы GNU bc. Переменные, массивы и имена функций GNU bc могут содержать более одного символа, в него включены дополнительные операторы из C, и, что важно, после оператора `if` может следовать оператор `else`. Вывод достигается либо путем намеренного не присвоения результата вычисления переменной (как это делается в POSIX), либо с помощью добавленной команды `print`. Кроме того, оператор `read` позволяет интерактивно вводить число в текущее вычисление. Помимо комментариев в стиле C, символ `#` приведет к игнорированию всего, что следует за ним до следующей новой строки. Значение последнего вычисления всегда сохраняется во встроенной переменной `last`.
Функции
Все функции, доступные в GNU bc, унаследованы от POSIX. Никаких дополнительных функций не поставляется вместе со стандартным дистрибутивом GNU.
Пример кода
Поскольку оператор `bc ^` допускает только целую степень справа, одной из первых функций, которую пользователь `bc` может написать, является функция возведения в степень с показателем с плавающей точкой. Оба следующих примера предполагают, что стандартная библиотека подключена.