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

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

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

Содержание
  • 1 Обзор
  • 2 История
  • 3 Реализации
    • 3.1 POSIX bc
      • 3.1.1 Математические операторы
        • 3.1.1.1 Точно так же, как C
        • 3.1.1.2 Подобно C
        • 3.1.1.3 Конфликт с C
        • 3.1.1.4 «Отсутствующие» операторы относительно C
      • 3.1.2 Встроенные функции
      • 3.1.3 Стандартные библиотечные функции
    • 3.2 Plan 9 bc
    • 3.3 GNU bc
      • 3.3.1 Дополнительные операторы
      • 3.3.2 Функции
  • 4 Пример кода
    • 4.1 «Степенная» функция в POSIX bc
    • 4.2 Вычисление π до 10000 цифр
    • 4.3 Транслированная функция C
  • 5 Использование bc в сценариях оболочки
  • 6 См. Также
  • 7 Ссылки
  • 8 Внешние ссылки
Обзор

Типичным интерактивным использованием является ввод команды 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

Стандартизованный 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 /*и */(начало и конец комментария).

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

Точно так же, как 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% 3 2 шкала = 1; 5% 3.2 масштаб = 20; 5% 3.00000000000000000002
Конфликт с C

Операторы

^ ^ =

внешне напоминают побитовые операторы C исключающее ИЛИ, но фактически являются операторами возведения в степень bc.

Особо следует отметить, что использование оператора ^с отрицательными числами не соответствует приоритету оператора C. -2 ^ 2дает ответ 4 под bc, а не −4.

«Отсутствующие» операторы относительно C

Битовые , логические и условные операторы :

| ^ || = | = ^ = = || = <<>><<=>>=?:

недоступны в POSIX bc.

Встроенные функции

Функция sqrt()для вычисления квадратных корней является единственной встроенной функцией POSIX bc. математическая функция. Другие функции доступны во внешней стандартной библиотеке.

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

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

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

Стандартная библиотека bc
команда 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

Plan 9 bc идентичен POSIX bc, но для дополнительного напечатайтезаявление.

GNU 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, - это степенная функция с показатель с плавающей запятой. Оба приведенных ниже предполагают, что стандартная библиотека была включена:

Функция "power" в POSIX 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)))}

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

Вычислите pi, используя встроенную функцию arctangent, a ():

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

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

Поскольку синтаксис 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 в сценариях оболочки

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 имеет страницу по теме: Команды
Последняя правка сделана 2021-05-12 08:14:14
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте