bc , для базового калькулятора , — это « язык калькулятора произвольной точности » с синтаксисом, похожим на язык программирования C. bc обычно используется либо как язык математических сценариев, либо как интерактивная математическая оболочка.
Типичное интерактивное использование — это ввод команды bc
в командной строке Unix и ввод математического выражения, например , после чего(1 + 3) * 2
8будет выводиться. Хотя bc может работать с произвольной точностью, на самом деле по умолчанию он равен нулю цифр после десятичной точки, поэтому выражение 2/3
дает результат0(результаты усекаются, а не округляются). Это может удивить новых пользователей bc, не знающих об этом факте. Опция -l
bc устанавливает масштаб по умолчанию (цифры после запятой) равный 20 и добавляет в язык несколько дополнительных математических функций.
bc впервые появился в версии 6 Unix в 1975 году. Он был написан Лориндой Черри из Bell Labs как интерфейс к dc , калькулятору произвольной точности, написанному Робертом Моррисом и Черри. dc выполнял вычисления произвольной точности, указанные в обратной польской записи . bc предоставил обычный интерфейс на языке программирования с теми же возможностями через простой компилятор (один исходный файл yacc , содержащий несколько сотен строк кода), который преобразовывал синтаксис, подобный C , в нотацию dc и передавал результаты через dc.
В 1991 году POSIX строго определил и стандартизировал bc. Сегодня сохранились три реализации этого стандарта: первая — традиционная реализация Unix, интерфейс для постоянного тока, которая сохранилась в системах Unix и Plan 9 . Второе — свободное программное обеспечение GNU bc, впервые выпущенное в 1991 году Филипом А. Нельсоном. Реализация GNU имеет множество расширений помимо стандарта POSIX и больше не является интерфейсом для dc (это интерпретатор байт-кода ). Третий — это повторная реализация OpenBSD в 2003 году.
Стандартизированный POSIX язык bc традиционно записывается как программа на языке программирования постоянного тока , чтобы обеспечить более высокий уровень доступа к функциям языка постоянного тока без сложностей краткого синтаксиса постоянного тока.
В этой форме язык bc содержит однобуквенные имена переменных , массивов и функций , а также большинство стандартных арифметических операторов, а также знакомые конструкции потока управления ( и ) из C. В отличие от C, за предложением не может следовать оператор. .if(cond)...
while(cond)...
for(init;cond;inc)...
if
else
Функции определяются с использованием define
ключевого слова, а значения возвращаются из них с использованием символа, return
за которым следует возвращаемое значение в круглых скобках. Ключевое auto
слово (необязательное в C) используется для объявления переменной как локальной для функции.
Все числа и содержимое переменных представляют собой числа произвольной точности , точность которых (в десятичных знаках) определяется глобальной scale
переменной.
Числовая база ввода (в интерактивном режиме), вывода и программных констант может быть указана путем установки зарезервированных ibase
(база ввода) и 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 до н. э.
Функция sqrt()
вычисления квадратных корней — единственная встроенная математическая функция POSIX bc. Другие функции доступны во внешней стандартной библиотеке.
Также встроены функция определения точности (как и для переменной) своего аргумента и функция определения количества значащих десятичных цифр в его scale()
аргументе scale
.length()
Стандартная математическая библиотека bc (определяемая опцией -l ) содержит функции для вычисления синуса , косинуса , арктангенса , натурального логарифма , экспоненциальной функции и двухпараметрической функции Бесселя J. С их помощью можно построить большинство стандартных математических функций (включая другие обратные тригонометрические функции). См. внешние ссылки для реализации многих других функций.
Опция -l изменяет масштаб на 20, [1] , поэтому такие вещи, как модуль по модулю, могут работать неожиданно. Например, если написать, bc -l
а затем команда print 3%2
выведет 0. Но написать scale=0
после bc -l
, а затем команда print 3%2
выведет 1.
Plan 9 bc идентичен POSIX bc, но содержит дополнительный print
оператор.
GNU bc основан на стандарте POSIX и включает в себя множество улучшений. Он полностью отделен от реализаций стандарта POSIX на основе постоянного тока и вместо этого написан на 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 s s = масштаб масштаб = 0 x /= 1 /* округление x вниз */ масштаб = s return ( x ) } /* Используем тот факт, что x^y == e^(y*log(x)) */ define p ( x , y ) { if ( y == i ( y )) { return ( x ^ y ) } return ( е ( y * l ( x ) ) ) }
Вычислите число Пи , используя встроенную функцию арктангенса a() :
$ bc -lq масштаб=10000 4*a(1) # Атан числа 1 равен 45 градусам, что равно пи/4 в радианах. # Расчет может занять несколько минут . _
Поскольку синтаксис bc аналогичен синтаксису C , опубликованные числовые функции, написанные на C, часто можно довольно легко перевести в bc, что сразу же обеспечивает произвольную точность bc. Например, в Журнале статистического программного обеспечения (июль 2004 г., том 11, выпуск 5) Джордж Марсалья опубликовал следующий код C для кумулятивного нормального распределения :
двойной Фи ( дабл х ) { длинный двойной s знак равно Икс , т знак равно 0 , б знак равно Икс , q знак равно Икс * Икс , я знак равно 1 ; while ( s != t ) s = ( t = s ) + ( b *= q / ( i += 2 )); return .5 + s * exp ( -.5 * q -.91893853320467274178L ); }
С некоторыми необходимыми изменениями для соответствия другому синтаксису bc и осознанием того, что константа «0,9189...» на самом деле равна log(2*PI)/2, это можно преобразовать в следующий код GNU bc:
определить фи ( Икс ) { авто s , т , б , q , я , const с знак равно х ; т = 0 ; б = х ; д = х * х ; i = 1 while ( 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 можно использовать неинтерактивно, с вводом через канал . Это полезно внутри сценариев оболочки . Например:
$ result = $( echo "scale=2; 5 * 7 /3;" | bc ) $ echo $result 11.66
Напротив, обратите внимание, что оболочка bash выполняет только целочисленную арифметику, например:
$ result = $(( 5 * 7/3 ) ) $ echo $ result 11
Также можно использовать идиому here-string (в bash, ksh, csh):
$ bc -l <<< "5*7/3" 11.66666666666666666666