bc (язык программирования)
Эта статья включает список общих ссылок , но в ней отсутствуют достаточные соответствующие встроенные цитаты . ( июнь 2013 г. ) |
Разработчик(и) | Роберт Моррис и Лоринда Черри из Bell Labs |
---|---|
Первоначальный выпуск | 1975 г., 48–49 лет назад. |
Операционная система | Unix , Unix-подобные , Plan 9 , FreeDOS |
Платформа | Кросс-платформенный |
Тип | Команда |
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 году. Четвертый — независимая реализация Гэвина Ховарда. [1] который включен в Android (операционную систему) , [2] [3] FreeBSD версии 13.3-РЕЛИЗ, [4] [5] [6] и macOS начиная с 13.0. [7] [8] [9]
Реализации
[ редактировать ]POSIX до нашей эры
[ редактировать ]Стандартизированный POSIX язык bc традиционно записывается как программа на языке программирования постоянного тока , чтобы обеспечить более высокий уровень доступа к функциям языка постоянного тока без сложностей краткого синтаксиса постоянного тока.
В этой форме язык bc содержит однобуквенные имена переменных , массивов и функций , а также большинство стандартных арифметических операторов, а также знакомые конструкции потока управления ( if(cond)...
, while(cond)...
и for(init;cond;inc)...
) из C. В отличие от C, 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
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
scale=0; 5%3
2
scale=1; 5%3
.2
scale=20; 5%3
.00000000000000000002
Конфликт с C
[ редактировать ]Операторы
^ ^=
внешне напоминают побитовые операторы исключающего или в C , но на самом деле являются операторами возведения в степень целого числа bc.
Особо следует отметить использование ^
Оператор с отрицательными числами не соответствует приоритету оператора C. -2^2
дает ответ 4 под bc, а не -4.
«Отсутствующие» операторы относительно C
[ редактировать ]Побитовые логические , условные и : операторы
& | ^ && || &= |= ^= &&= ||= << >> <<= >>= ?:
недоступны в POSIX до н. э.
Встроенные функции
[ редактировать ]The sqrt()
Функция вычисления квадратных корней — единственная встроенная математическая функция POSIX bc. Другие функции доступны во внешней стандартной библиотеке.
The scale()
функция для определения точности (как и в случае с scale
переменная) своего аргумента и length()
Также встроена функция определения количества значащих десятичных цифр в ее аргументе.
Стандартные библиотечные функции
[ редактировать ]Стандартная математическая библиотека bc (определяемая опцией -l ) содержит функции для вычисления синуса , косинуса , арктангенса , натурального логарифма , экспоненциальной функции и двухпараметрической Бесселя J. функции С их помощью можно построить большинство стандартных математических функций (включая другие обратные тригонометрические функции). См. внешние ссылки для реализации многих других функций.
команда bc | Функция | Описание |
---|---|---|
s(x)
|
Его | Принимает x , угол в радианах |
c(x)
|
Косинус | Принимает x , угол в радианах |
a(x)
|
Арктангенс | Возвращает радианы |
l(x)
|
Натуральный логарифм | |
e(x)
|
Экспоненциальная функция | |
j(n,x)
|
Функция Бесселя | порядка n Возвращает функцию Бесселя от x . |
Опция -l изменяет масштаб на 20, [10] поэтому такие вещи, как modulo, могут работать неожиданно. Например, написание 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 и включает в себя множество улучшений. Он полностью отличается от реализаций стандарта POSIX на основе постоянного тока и вместо этого написан на C. Тем не менее, он полностью обратно совместим, поскольку все программы POSIX bc будут работать без изменений как программы GNU bc.
Переменные, массивы и имена функций GNU bc могут содержать более одного символа, из C было включено еще несколько операторов, в частности, if
после этого пункта может следовать else
.
Вывод достигается либо намеренным отказом от присвоения результата вычисления переменной (способ POSIX), либо использованием добавленного print
заявление.
Кроме того, read
Оператор позволяет интерактивно вводить число в текущие вычисления.
В дополнение к комментариям в стиле C, #
символ приведет к тому, что все после него будет игнорироваться до следующей новой строки.
Значение последнего расчета всегда сохраняется в дополнительном встроенном last
переменная.
Дополнительные операторы
[ редактировать ]Следующие логические операторы являются дополнительными к операторам POSIX bc:
&& || !
Они доступны для использования в условных операторах (например, внутри if
заявление). Однако обратите внимание, что до сих пор не существует эквивалентных побитовых операций или операций присваивания.
Функции
[ редактировать ]Все функции, доступные в GNU bc, унаследованы от POSIX. Никаких дополнительных функций в стандартной комплектации дистрибутива GNU не предусмотрено.
Пример кода
[ редактировать ]С момента нашей эры ^
Оператор допускает только целочисленную степень справа от него, одна из первых функций, которые может написать пользователь bc, — это степенная функция с показателем степени с плавающей запятой. Оба приведенных ниже примера предполагают, что включена стандартная библиотека:
Функция «Power» в POSIX до н. э.
[ редактировать ] /* A function to return the integer part of x */
define i(x) {
auto s
s = scale
scale = 0
x /= 1 /* round x down */
scale = s
return (x)
}
/* Use the fact that x^y == e^(y*log(x)) */
define p(x,y) {
if (y == i(y)) {
return (x ^ y)
}
return ( e( y * l(x) ) )
}
Вычисление π до 10000 цифр
[ редактировать ]Вычислите число Пи, используя встроенную функцию арктангенса : а() :
$ bc -lq
scale=10000
4*a(1) # The atan of 1 is 45 degrees, which is pi/4 in radians.
# This may take several minutes to calculate.
Переведенная функция C
[ редактировать ]Поскольку синтаксис bc аналогичен синтаксису C , опубликованные числовые функции, написанные на C, часто можно довольно легко перевести в bc, что сразу же обеспечивает произвольную точность bc. Например, в Журнале статистического программного обеспечения (июль 2004 г., том 11, выпуск 5) Джордж Марсалья опубликовал следующий код C для кумулятивного нормального распределения :
double Phi(double x)
{
long double s=x,t=0,b=x,q=x*x,i=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:
define phi(x) {
auto s,t,b,q,i,const
s=x; t=0; b=x; q=x*x; 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 выполняет только целочисленную арифметику, например:
$ result=$((5 * 7 /3))
$ echo $result
11
Также можно использовать идиому here-string (в bash, ksh, csh):
$ bc -l <<< "5*7/3"
11.66666666666666666666
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Реализация Unix dc и POSIX bc с расширениями GNU и BSD.
- ^ https://android.googlesource.com/platform/system/core/+/master/shell_and_utilities/README.md
- ^ https://android.googlesource.com/platform/external/bc/
- ^ https://forums.freebsd.org/threads/freebsd-13-3-whats-new-and-how-did-we-get-here.92596/
- ^ https://man.freebsd.org/cgi/man.cgi?query=bc&apropos=0&sektion=1&manpath=FreeBSD+14.1-RELEASE&arch=default&format=html
- ^ https://cgit.freebsd.org/src/tree/contrib/bc
- ^ https://opensource.apple.com/releases/
- ^ https://github.com/apple-oss-distributions/bc/tree/main/bc
- ^ https://gavinhoward.com/2023/02/my-code-conquered-another-os/
- ↑ Перейти обратно: Перейти обратно: а б Единая спецификация UNIX , версия 4 от The Open Group : арифметический язык произвольной точности — Справочник по оболочке и утилитам,
- Единая спецификация UNIX , версия 4 от The Open Group : арифметический язык произвольной точности — Справочник по оболочке и утилитам,
- Страница руководства GNU bc
- Страница руководства POSIX bc
- Plan 9 , том 1 Руководство программиста –
- Страница руководства по 7-му изданию Unix bc. Архивировано 8 октября 2006 г. на Wayback Machine.
- Статья comp.compilers о проектировании и реализации C-bc.
- Исходный код bc для Unix 6-го издания , первая версия bc, выпущенная в мае 1975 года, компилирующая синтаксис bc в синтаксис dc.
- исходный код GNU bc
Внешние ссылки
[ редактировать ]- Диттмер, И. 1993. Ошибка в командах Unix dc и bc для арифметики с множественной точностью. Новости SIGNUM. 28, 2 (апрель 1993 г.), 8–11.
- Коллекция полезных функций GNU bc
- GNU bc (и альфа-версия ) от Фонда свободного программного обеспечения.
- bc для Windows из GnuWin32
- Гэвин Ховард bc - еще одна реализация bc с открытым исходным кодом от Гэвина Ховарда с расширениями GNU и BSD.
- X-bc — графический интерфейс пользователя для bc
- Extensions.bc — содержит функции тригонометрии, показательные функции, функции теории чисел и некоторые математические константы.
- Scientific_constants.bc — содержит массы частиц, основные константы, такие как скорость света в вакууме и гравитационная постоянная.