Bc (язык программирования) - Bc (programming language)

до н.э
Разработчики)Роберт Моррис и Лоринда Черри из Bell Labs, Филип А. Нельсон
изначальный выпуск1975, 44–45 лет назад
Операционная системаUnix, Unix-подобный, План 9, FreeDOS
ПлатформаКроссплатформенность
ТипКоманда

до н.э, для базовый калькулятор (часто упоминается как настольный калькулятор), является "ан произвольная точность язык калькулятора"с синтаксисом, аналогичным Язык программирования C. bc обычно используется как язык математических сценариев или как интерактивная математическая оболочка.

Обзор

Типичное интерактивное использование - ввод команды до н.э на Unix командная строка и введите математическое выражение, например (1 + 3) * 2, после чего 8 будет выводиться. Хотя bc может работать с произвольной точностью, на самом деле он по умолчанию принимает нулевые цифры после десятичной точки, поэтому выражение 2/3 дает 0. Это может удивить новых пользователей bc, не знающих об этом факте. В -l опция до bc устанавливает значение по умолчанию масштаб (цифры после десятичной точки) до 20 и добавляет в язык несколько дополнительных математических функций.

История

до н.э. впервые появился в Версия 6 Unix в 1975 году и был написан Роберт Моррис и Лоринда Черри из Bell Labs. до н.э. предшествовал Округ Колумбия, более ранний калькулятор произвольной точности, написанный теми же авторами. dc может производить вычисления с произвольной точностью, но его обратная польская запись (RPN) синтаксис, очень любимый многими для вычисления алгебраических формул, оказался неудобным для его пользователей при выражении управления потоком, и поэтому bc был написан как интерфейс для dc. до н.э. был очень простым компилятор (один yacc исходный файл с несколькими сотнями строк), который преобразовал новый синтаксис типа C, bc в синтаксис dc постфиксная запись и передал результаты через dc.

В 1991 г. POSIX строго определенные и стандартизированные bc. Три реализации этого стандарта выживают и сегодня: первая - это традиционная реализация Unix, интерфейс для dc, которая выживает в Unix и План 9 системы. Второй - это свободное программное обеспечение GNU bc, впервые выпущенный в 1991 году Филипом А. Нельсоном. Реализация GNU имеет множество расширений, выходящих за рамки стандарта POSIX, и больше не является интерфейсом к dc (это интерпретатор байт-кода ). Третий - это повторная реализация OpenBSD в 2003 году.

Реализации

POSIX bc

Стандартизованный язык Bc POSIX традиционно пишется как программа на Округ Колумбия язык программирования для обеспечения более высокого уровня доступа к функциям языка dc без сложностей, связанных с лаконичным синтаксисом dc.

В этой форме язык bc содержит однобуквенные переменная, массив и функция имена и большинство стандартных арифметических операторов, а также знакомые поток управления конструкции (если(cond)..., в то время как(cond)... и для(в этом;cond;inc)...) из C.В отличие от C, если за оговоркой не может следовать еще.

Функции определяются с помощью определить ключевое слово, и значения возвращаются из них с помощью вернуть за которым следует возвращаемое значение в круглых скобках. В авто ключевое слово (необязательно в C) используется для объявления переменной как локальной для функции.

Все числа и содержимое переменных произвольная точность числа, точность которых (в десятичных разрядах) определяется глобальным масштаб переменная.

В числовая база ввода (в интерактивном режиме), вывода и программных констант можно указать, задав зарезервированные ibase (входная база) и Obase (выходная база) переменные.

Выходные данные создаются путем намеренного отказа от присвоения результата вычисления переменной.

Комментарии могут быть добавлены к коду bc с помощью C /* и */ (начало и конец комментария) символы.

Математические операторы

Точно как C

Следующий POSIX bc операторы ведут себя точно так же, как их аналоги на C:

+     -     *     /+=    -=    *=    /=++    --    <     >==    !=    <=    >=( )   [ ]   { }
Подобно C

В модуль операторы, % и %= ведут себя так же, как их аналоги на C, только когда глобальный масштаб переменная установлена ​​в 0, т.е. все вычисления производятся только для целых чисел. В противном случае расчет выполняется с соответствующим масштабом. а% б определяется как а- (а / б) * б. Примеры:

$ до н.э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 bc. Другие функции доступны во внешней стандартной библиотеке.

В масштаб() функция для определения точности (как с масштаб переменной) своего аргумента и длина () Также встроена функция определения количества значащих десятичных цифр в его аргументе.

Стандартные библиотечные функции

стандартная математическая библиотека bc (определенная с -l option) содержит функции для расчета синус, косинус, арктангенс, натуральный логарифм, то экспоненциальная функция и два параметра Функция Бесселя J. С их помощью можно построить большинство стандартных математических функций (включая другие обратные тригонометрические функции). См. Внешние ссылки для реализации многих других функций.

Стандартная библиотека bc[1]
команда bcФункцияОписание
s (x)СинусБерет Икс, угол в радианы
с (х)КосинусБерет Икс, угол в радианах
а (х)АрктангенсВозвращает радианы.
л (х)Натуральный логарифм
е (х)Экспоненциальная функция
j (n, x)Функция БесселяВозвращает заказ-п Функция Бесселя Икс.

В -l опция изменяет масштаб на 20,[1] поэтому такие вещи, как modulo, могут работать неожиданно. Например, написание bc -l а затем команда печать 3% 2 выводит 0. Но писать масштаб = 0 после bc -l а затем команда печать 3% 2 выведет 1.

План 9 до н.э.

План 9 bc идентичен POSIX bc, но для дополнительных Распечатать заявление.

GNU bc

GNU bc является производным от стандарта POSIX и включает множество улучшений. Он полностью отделен от реализаций стандарта POSIX на основе dc и написан на C. Тем не менее, он полностью обратно совместим, поскольку все программы POSIX bc будут работать без изменений как программы GNU bc.

Переменные GNU bc, массивы и имена функций могут содержать более одного символа, еще несколько операторов были включены из C, и, в частности, если за оговоркой может следовать еще.

Результат достигается либо путем намеренного отказа от присвоения результата вычисления переменной (способ POSIX), либо с помощью добавленного Распечатать заявление.

Кроме того, читать оператор позволяет интерактивный ввод числа в текущее вычисление.

Помимо комментариев в стиле C, # символ заставит все после него до следующей новой строки игнорироваться.

Значение последнего расчета всегда сохраняется в дополнительном встроенном последний переменная.

Дополнительные операторы

Следующее логические операторы являются дополнительными к POSIX bc:

&&     ||      !

Они доступны для использования в условных операторах (например, в если заявление). Обратите внимание, однако, что по-прежнему нет эквивалентных побитовых операций или операций присваивания.

Функции

Все функции, доступные в GNU bc, унаследованы от POSIX. Никаких дополнительных функций в стандартной комплектации GNU не предусмотрено.

Пример кода

Поскольку до нашей эры ^ Оператор допускает только целочисленную степень справа от нее, одна из первых функций, которые может написать пользователь bc, - это степенная функция с показателем с плавающей запятой. Оба нижеприведенных примера предполагают, что стандартная библиотека была включена:

Функция "power" в POSIX bc

 / * Функция для возврата целой части x * / определить я(Икс) {    авто с с = масштаб    масштаб = 0    Икс /= 1   / * округлить x вниз * /    масштаб = s вернуть (Икс) } / * Используйте тот факт, что x ^ y == e ^ (y * log (x)) * / определить п(Икс,у) {    если (у == я(у)) {       вернуть (Икс ^ у)    }    вернуть ( е( у * л(Икс) ) ) }

Вычисление π до 10000 цифр

Рассчитать Пи используя встроенный арктангенс функция а ():

$ bc -lqмасштаб = 100004 * a (1) # Атан 1 равен 45 градусам, что равно пи / 4 в радианах.       # Расчет может занять несколько минут.

Переведенная функция C

Поскольку синтаксис bc аналогичен синтаксису C опубликованные числовые функции, написанные на C, часто довольно легко переводятся в bc, что сразу обеспечивает произвольную точность bc. Например, в Журнал статистического программного обеспечения (Июль 2004 г., том 11, выпуск 5), Джордж Марсалья опубликовал следующий код C для кумулятивное нормальное распределение:

двойной Фи(двойной Икс){    длинная двойной s=Икс,т=0,б=Икс,q=Икс*Икс,я=1;    в то время как(s!=т)        s=(т=s)+(б*=q/(я+=2));    вернуть .5+s*exp(-.5*q-.91893853320467274178L);}

С некоторыми необходимыми изменениями для приспособления к другому синтаксису bc и пониманием того, что константа «0.9189 ...» на самом деле является log (2 * PI) / 2, это можно преобразовать в следующий код GNU bc:

определить фи(Икс) {    авто s,т,б,q,я,const s=Икс; т=0; б=Икс; q=Икс*Икс; я=1    в то время как(s!=т)        s=(т=s)+(б*=q/(я+=2))    const=0.5*л(8*а(1))   # 0.91893...    вернуть .5+s*е(-.5*q-const)}

Использование bc в сценариях оболочки

bc можно использовать не интерактивно, с вводом через труба. Это полезно внутри сценарии оболочки. Например:

$ результат=$(эхо «масштаб = 2; 5 * 7/3;» | до н.э)$ эхо $ результат11.66

Напротив, обратите внимание, что оболочка bash выполняет только целочисленную арифметику, например:

$ результат=$((5 * 7 /3))$ эхо $ результат11

Также можно использовать здесь строка идиома (в bash, ksh, csh):

$ bc -l <<< "5*7/3"11.66666666666666666666

Смотрите также

использованная литература

  1. ^ а б Нельсон, Филип А. (20 марта 2001 г.). "Руководство по командам bc". Фонд свободного программного обеспечения. Получено 2017-04-20.

внешние ссылки