stringtranslate.com

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

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

Обзор

Типичное интерактивное использование — это ввод команды bcв командной строке Unix и ввод математического выражения, например , после чего(1 + 3) * 28будет выводиться. Хотя bc может работать с произвольной точностью, на самом деле по умолчанию он равен нулю цифр после десятичной точки, поэтому выражение 2/3дает результат0(результаты усекаются, а не округляются). Это может удивить новых пользователей bc, не знающих об этом факте. Опция -lbc устанавливает масштаб по умолчанию (цифры после запятой) равный 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 году.

Реализации

POSIX до нашей эры

Стандартизированный POSIX язык bc традиционно записывается как программа на языке программирования постоянного тока , чтобы обеспечить более высокий уровень доступа к функциям языка постоянного тока без сложностей краткого синтаксиса постоянного тока.

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

Функции определяются с использованием 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 Авторские права 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 до н. э.

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

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

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

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

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

Опция -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 и включает в себя множество улучшений. Он полностью отделен от реализаций стандарта POSIX на основе постоянного тока и вместо этого написан на 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 до н. э.

 /* Функция, возвращающая целую часть x */  define i ( x )  {  auto s s =  масштаб  масштаб  =  0 x /=  1  /* округление x вниз */  масштаб  = s return  ( x )  } /* Используем тот факт, что x^y == e^(y*log(x)) */  define p ( x , y )  {  if  ( y == i ( y ))  {  return  ( x ^ y )  }  return  ( е ( y * l ( x )  )  )  }

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

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

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

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

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

двойной Фи ( дабл х ) { длинный двойной s знак равно Икс , т знак равно 0 , б знак равно Икс , q знак равно Икс * Икс , я знак равно 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:

определить фи ( Икс )  {  авто s , т , б , q , я , const с знак равно х ; т = 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 выполняет только целочисленную арифметику, например:

$ result = $(( 5 * 7/3 ) ) $ echo $ result 11    

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

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

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

Рекомендации

  1. ^ ab bc: арифметический язык произвольной точности - Справочник по оболочке и утилитам, Единая спецификация UNIX , версия 4 от The Open Group

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