bc: язык численных расчетов с произвольной точностью

Автор: Маркус Грюнвальд (Markus Grunwald)
Перевод: Алексей Бешенов

2008-03-05

Оригинал: «bc: an arbitrary precision numeric processing language», 11 октября 2007 г.

В Debian сейчас можно найти 84 пакета, так или иначе связанных с расчетами: apt-cache search calculator  wc -l. Вместо более красивых калькуляторов можно использовать bc. У bc нет модного графического интерфейса — это консольная программа с простым математическим языком — а потому bc быстро работает и легко программируется.

Каждодневное использование

По умолчанию, bc работает в непривычном режиме с целочисленной арифметикой и без функций вроде синуса, косинуса и логарифма. Исправить дело можно, указав при запуске bc параметр -l — тогда будет использоваться стандартная математическая библиотека. Чтобы не печатать всегда «bc -l», можно использовать переменную окружения BC_ENV_ARGS. В bash достаточно добавить в ~/.bashrc строчку «export BC_ENV_ARGS=-l».

Итак, посмотрим для начала bc в каждодневном использовании. Введем выражение и нажмем клавишу ввода:

$ 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'.
850*77.1        
65535.0
Да, bc считает лучше, чем Excel 2007. И результат будет получен быстрее, чем если бы вы запускали калькулятор для KDE или GNOME.

Произвольная точность и функции

По умолчанию, при запуске с «-l», bc дает результаты с 20 десятичными знаками после плавающей точки, но число знаков можно увеличить до 2 147 483 647. Чтобы получить достаточно хорошую оценку ?, просто напишите
scale=200  
4*a(1)     
3.141592653589793238462643383279502884197169399375105820974944592307
81640628620899862803482534211706798214808651328230664709384460955058
223172535940812848111745028410270193852110555964462294895493038196
Впечатляет. Но что такое «a(1)»? bc использует очень короткие имена для тригонометрических функций. a(x) — арктангенс x. Если вы предпочитаете более длинные имена, запишите в файл определение своей функции, после чего добавьте этот файл в BC_ENV_ARGS, и он будет считываться при каждом запуске bc. Лучше всего загрузить готовый файл extensions.bc по адресу http://x-bc.sourceforge.net/extensions_bc.html

Моя переменная BC_ENV_ARGS выглядит примерно так:

$ echo $BC_ENV_ARGS
-q -l /home/gru/.bc/extensions.bc
extensions.bc определяет некоторые функции под более привычными именами, например так:
define sin(x)
{
    return (s(x))
}
В том же духе вы можете задавать собственные функции. Часто мне нужно преобразовывать отношения напряжений или токов в децибелы:
define db(x,y)
{
    return 20*log(x/y);
}

Работа с разными системами счисления

bc может выполнять преобразования между произвольными системами счисления. Допустим, нужно перейти от десятичной записи числа к шестнадцатеричной. Для этого установим основание системы счисления для вывода obase равным 16:
obase=16 
10
A
Конечно, с этими числами можно проводить расчеты:
10/7
1.6DB6DB6DB6DB6DB6B
Основание системы счисления для ввода тоже можно менять:
ibase=16 
A/2
5
sin(AFFE) 
-.B1F4021654E454E72 
(Предлагаю самостоятельно разобраться, что это такое :-)

Использование в скриптах

Bash — хороший командный интерпретатор, но при сложных расчетах $(()) не поможет. Можно вызвать bc:
$ a=$( echo "l(1024)/l(2)" | bc )
$ echo $a
10

Заключение

Я долго искал идеальный калькулятор. После работы с несколькими графическими программами, я перешел на bc, и bc оказался как нельзя лучше. Надеюсь, вам тоже понравится.

bc есть во всех версиях Debian и в Ubuntu Dapper, Edgy, Feisty, Gutsy.

Ссылки