Ьс , для базового калькулятора (часто упоминается как скамейка калькулятор ), является « произвольной точностью языка калькулятор » синтаксис похож на язык программирования Си . bc обычно используется либо как язык математических сценариев, либо как интерактивная математическая оболочка.
Разработчики) | Роберт Моррис и Лоринда Черри из Bell Labs , Филип А. Нельсон |
---|---|
Первый выпуск | 1975, 45–46 лет назад |
Операционная система | Unix , Unix-подобный , Plan 9 , FreeDOS |
Платформа | Кроссплатформенность |
Тип | Командование |
Обзор
Типичное интерактивное использование - ввод команды 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 с несколькими сотнями строк), который преобразовывал новый синтаксис bc, подобный C, в постфиксную нотацию dc и передавал результаты через dc.
В 1991 году POSIX строго определил и стандартизировал bc. Три реализации этого стандарта выживают и сегодня: первая - это традиционная реализация Unix, интерфейс для dc, которая сохранилась в системах Unix и Plan 9 . Вторая - это бесплатное программное обеспечение GNU bc, впервые выпущенное в 1991 году Филипом А. Нельсоном. Реализация GNU имеет множество расширений, выходящих за рамки стандарта POSIX, и больше не является интерфейсом для dc (это интерпретатор байт-кода ). Третий - это повторная реализация OpenBSD в 2003 году.
Реализации
POSIX до н.э.
Стандартизованный POSIX язык bc традиционно пишется как программа на языке программирования dc, чтобы обеспечить более высокий уровень доступа к функциям языка dc без сложностей краткого синтаксиса dc.
В этой форме язык bc содержит однобуквенные имена переменных , массивов и функций и большинство стандартных арифметических операторов, а также знакомые конструкции потока управления ( , и ) из C.В отличие от C, за предложением не может следовать .if(cond)...
while(cond)...
for(init;cond;inc)...
if
else
Функции определяются с помощью define
ключевого слова, а значения возвращаются из них с помощью return
символа, за которым следует возвращаемое значение в круглых скобках. auto
Ключевое слово (необязательно в C) используется , чтобы объявить переменную как локальные для функции.
Все числа и содержимое переменных являются числами произвольной точности , точность которых (в десятичных разрядах) определяется глобальной scale
переменной.
Цифровая база ввода (в интерактивном режиме), вывод и программные константы могут быть определена путем установки зарезервированного ibase
(вход базы) и obase
(выходная базы) переменные.
Выходные данные создаются путем намеренного отказа от присвоения результата вычисления переменной.
Комментарии могут быть добавлены в код bc с помощью символов C /*
и */
(начальный и конечный комментарий).
Математические операторы
Точно так же, как C
Следующие операторы POSIX bc ведут себя точно так же, как их аналоги в C:
+ - * /+ = - = * = / =++ - <>==! = <=> =() [] {}
Подобно 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% 32масштаб = 1; 5% 3.2масштаб = 20; 5% 3.00000000000000000002
Конфликт с C
Операторы
^ ^ =
внешне напоминают поразрядные операторы исключающего ИЛИ в языке C , но на самом деле являются целочисленными операторами возведения в степень bc.
Особо следует отметить, что использование ^
оператора с отрицательными числами не соответствует приоритету оператора C. -2^2
дает ответ 4 под bc, а не −4.
"Отсутствующие" операторы относительно C
Побитовое , логические и условные операторы:
& | ^ && ||& = | = ^ = && = || =<< >><< = >> =?:
недоступны в POSIX bc.
Встроенные функции
sqrt()
Функция для вычисления квадратных корней является POSIX Британской Колумбии только встроенный в математической функции. Другие функции доступны во внешней стандартной библиотеке.
scale()
Функция для определения точности (как с scale
переменным) его аргументом и length()
функцией для определения числа значащих десятичных цифр в качестве аргумента также встроено.
Стандартные библиотечные функции
Стандартная математическая библиотека Британской Колумбии (определенная с -l вариант) содержит функции для вычисления синус , косинус , арктангенс , натуральный логарифм , то экспоненциальную функцию и два параметра функции Бесселя J . С их помощью можно построить большинство стандартных математических функций (включая другие обратные тригонометрические функции). См. Внешние ссылки для реализации многих других функций.
команда bc | Функция | Описание |
---|---|---|
s(x) | Синус | Принимает x , угол в радианах |
c(x) | Косинус | Принимает x , угол в радианах |
a(x) | Арктангенс | Возвращает радианы. |
l(x) | Натуральный логарифм | |
e(x) | Экспоненциальная функция | |
j(n,x) | Функция Бесселя | Возвращает функцию Бесселя порядка n от x . |
Параметр -l изменяет масштаб на 20, [1], поэтому такие вещи, как по модулю, могут работать неожиданно. Например, запись, bc -l
а затем команда print 3%2
выводит 0. Но запись scale=0
после, bc -l
а затем команда print 3%2
выводит 1.
План 9 до н.э.
Plan 9 bc идентичен POSIX bc, но содержит дополнительный print
оператор.
GNU до н.э.
GNU bc является производным от стандарта POSIX и включает множество улучшений. Он полностью отделен от основанных на dc реализаций стандарта POSIX и написан на C. Тем не менее, он полностью обратно совместим, поскольку все программы POSIX bc будут работать без изменений как программы GNU bc.
Переменные GNU bc, массивы и имена функций могут содержать более одного символа, еще несколько операторов были включены из C, и, в частности, за if
предложением может следовать оператор else
.
Выход достигается либо путем преднамеренного отказа от присвоения результата вычисления переменной (способ POSIX), либо с помощью print
оператора added .
Кроме того, read
оператор позволяет интерактивный ввод числа в текущее вычисление.
В дополнение к комментариям в стиле C, #
символ заставит игнорировать все, что находится после него, до следующей новой строки.
Значение последнего вычисления всегда сохраняется в дополнительной встроенной last
переменной.
Дополнительные операторы
Следующие логические операторы являются дополнительными к операторам POSIX bc:
&& || !
Они доступны для использования в условных операторах (например, внутри if
оператора). Однако обратите внимание, что по-прежнему нет эквивалентных побитовых операций или операций присваивания.
Функции
Все функции, доступные в GNU bc, унаследованы от POSIX. Никаких дополнительных функций в стандартной комплектации GNU не предусмотрено.
Пример кода
Поскольку ^
оператор bc допускает только целочисленную степень справа от нее, одна из первых функций, которые может написать пользователь bc, - это степенная функция с показателем степени с плавающей запятой. Оба нижеприведенных примера предполагают, что стандартная библиотека была включена:
Функция "мощности" в POSIX bc
/ * Функция для возврата целой части x * / define i ( x ) { auto s s = 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 ) ) ) }
Вычисление π до 10000 цифр
Вычислите число Пи с помощью встроенной функции арктангенса a () :
$ bc -lq масштаб = 100004 * a (1) # Атан 1 равен 45 градусам, что равно пи / 4 в радианах. # Расчет может занять несколько минут.
Транслированная функция C
Поскольку синтаксис bc аналогичен синтаксису C , опубликованные числовые функции, написанные на C, часто могут быть довольно легко преобразованы в bc, что сразу обеспечивает произвольную точность bc. Например, в Journal of Statistical Software (июль 2004 г., том 11, выпуск 5) Джордж Марсалья опубликовал следующий код на языке C для кумулятивного нормального распределения :
двойной Phi ( двойной 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 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 в сценариях оболочки
bc можно использовать не интерактивно, с вводом через конвейер . Это полезно в сценариях оболочки . Например:
$ result = $ ( echo "scale = 2; 5 * 7/3;" | bc ) $ echo $ result 11.66
Напротив, обратите внимание, что оболочка bash выполняет только целочисленную арифметику, например:
$ Результат = $ (( 5 * 7 / 3 )) $ эхо $ результат 11
Также можно использовать идиому со строкой (в bash, ksh, csh):
$ bc -l <<< "5 * 7/3 " 11.66666666666666666666
Смотрите также
- язык программирования постоянного тока
- Язык программирования C
- язык программирования hoc
Рекомендации
- ^ a b Нельсон, Филип А. (20 марта 2001 г.). "Руководство по командам BC" . Фонд свободного программного обеспечения . Проверено 20 апреля 2017 .
- : язык арифметики произвольной точности - Справочник по командам и служебным программам, спецификация Single UNIX , выпуск 7 от The Open Group
- Страница руководства GNU bc
- Страница руководства POSIX bc
- - Руководство программиста Plan 9 , том 1
- Страница справочника 7th Edition Unix bc
- Статья comp.compilers о разработке и реализации C-bc
- 6-е издание исходный код Unix bc , первый выпуск bc, с мая 1975 года, компиляция синтаксиса bc в синтаксис dc
- исходный код bc
Внешние ссылки
- Диттмер, И. 1993. Ошибка в командах Unix dc и bc для арифметики с множественной точностью. SIGNUM Newsl. 28, 2 (апрель 1993 г.), 8–11.
- Сборник полезных функций GNU bc
- GNU bc (и альфа-версия ) от Free Software Foundation
- bc для Windows от GnuWin32
- Gavin Howard bc - еще одна реализация bc с открытым исходным кодом от Gavin Howard с расширениями GNU и BSD
- X-bc - графический интерфейс пользователя для bc
- extension.bc - содержит функции тригонометрии, экспоненциальные функции, функции теории чисел и некоторые математические константы
- Scientific_constants.bc - содержит массы частиц, основные константы, такие как скорость света в вакууме и гравитационная постоянная