5 июл. 2009 г.

bc: Quick start

Обычно, если мне надо что-то быстро посчитать (не важно, GNU/Linux или другая os) - ответ один - bc.

bc online manual
$ echo "161.61/(29.51 + 1.54)" | bc -l
5.20483091787439613526
Как вы догадываетесь bc не ограничен такими простыми действиями как сложение, вычитание, умножение и деление.
  • Некоторые математические функции
    e(x) = ex - экспоненциальная функция
    l(x) = ln(x) - лоналифм - натуральный логарифм
    s(x) = sin(x) - функция синуса, x - в радианах
    c(x) = cos(x) - функция косинуса, x - в радианах
    a(x) = arctan(x) - функция арктангенса, результат в радианах
    Если с числом e всё понятно, то где число ?
    т.к. , то
    $ echo "4*a(1)" | bc -l
    3.14159265358979323844
    Для вычисления используем нехитрую связь:
    Пример:
    $ echo "l(10)/l(2)" | bc -l
    3.32192809488736234789
  • Перевод в другие системы счисления
    ibase = input base - система счисления на входе
    obase = output base - система счисления на выходе
    Замечание 1: По-умолчанию, ibase = obase = 10
    Пример:
    $ echo "obase=16;243" | bc
    F3
    Замечание 2: при переводе из системы, содержащей буквы, они должны быть написаны в верхнем регистре
    Пример:
    $ echo "ibase=16;4FE" | bc
    1278
    Пример (перевод из 16чной системы счисления в двоичную):
    $ echo "ibase=16;obase=2;FE" | bc
    11111110
  • bc-скрипты
    bc можно использовать и для более объёмных вычислений.
    Для наглядности вычислим число e используя ряд Маклорена:
    print "e(x), x is "; x = read()
    print "iterations ? "; c = read()
    
    a = 1
    d = 1
    e = 0
    
    for (i = 0; i < c; i++){
    if (i > 0) {
    d *= i
    a *= x
    }   
    e += a / d
    }
    
    print e
    quit
    $ bc -l exp.bc
    e(x), x is 1
    iterations ? 100
    2.71828182845904523526
  • Различные настройки
    • scale=x; - точность, кол-во выводимых знаков после запятой
      $ echo "scale=5;1/3" | bc 
      .33333

4 комментария:

Анонимный комментирует...

Посредством чего можно связать bc c java? Допустим, чтобы наклепать хороший строчный калькулятор именно на java

Vladimir Dolzhenko комментирует...

На мой взгляд, не стоит всё грести под одну гребёнку. bc - хороший и мощный консольный инструмент.

В java много чего другого вкусного, и всё зависит от задачи.

Анонимный комментирует...

Задача - неконсольный калькулятор с заданными функциями для виндоус. Всё отлично идёт до слова "виндоус", потому как писать вручную свою bc трудно, тем более что подходит она под ситуацию просто отлично.

Вот и имеем. Сделать бы гуй из одной единственной строки (тоже непонятно как), да ещё и к венде это примастить.

Vladimir Dolzhenko комментирует...

this is NOT true way.
try java scripting (pls do not confuse with javascript) - I mean javax.scripting package.