Jump to content

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

(Перенаправлено с языка программирования Bc )
до нашей эры
Разработчик(и) Роберт Моррис и Лоринда Черри из 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. функции С их помощью можно построить большинство стандартных математических функций (включая другие обратные тригонометрические функции). См. внешние ссылки для реализации многих других функций.

Стандартная библиотека Британской Колумбии [10]
команда 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

См. также

[ редактировать ]
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: b9bf71547a5ac9a904053095d4929283__1721765520
URL1:https://arc.ask3.ru/arc/aa/b9/83/b9bf71547a5ac9a904053095d4929283.html
Заголовок, (Title) документа по адресу, URL1:
bc (programming language) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)