бц (програмски језик)

С Википедије, слободне енциклопедије

бц, за основни калкулатор (који се често назива клупа калкулатор), је "произвољне прецизности калкулатор" са синтаксом сличном Ц програмском језику. бц се обично користи као математичка скрипта језика или као интерактивна математичка љуска.[1][2] 

Типична интерактивна употреба пише командну бц на Јуникс командној линији и улази у математички израз, као што су  (1 + 3) * 2, након чега 8 ће бити излаз. Док бц може да ради са произвољном прецизношћу, заправо касни на нулу цифара након децималног зареза-тако да израз  2/3 приноси 0. Ово може изненадити нове бц кориснике несвесне те чињенице.  -lопција за бц одређује основну скалу (цифре након децималног зареза) до 20, и додаје још неколико математичких функција у језику. 

бц се први пут појавио у верзији 6 Јуникса 1975. године, а написали су га Роберт Морис и Лоринда Кери у Бел Лабу. бц је претходио дц, ранији калкулатори произвољне прецизности су писани од стране истих аутора. дц је могао да врши калкулације произвољно прецизности, али његова обрнута пољска нотација (РПН) синтакса је незгодна за кориснике, а самим тим бц је написан као фронт-енд у дц-у. Бц је био веома једноставан компајлер (један Yacc изворни фајл са неколико стотина линија), који претвара нови, као C, бц синтакса у дц је постфик нотација, и прослеђује резултате кроз дц. 

1991,ПОСИКС строго дефинише и стандардизује бц. Две имплементације овог стандарда су преживеле до данас: Прва је традиционална имплементација Јуникс и  предњи-крај дц, који опстају у Јуниксу и план 9 системима. Други је слободан софтвер ГНУ-бц, први пут објављен 1991. године од стране Филипа А. Нелсона. Имплементација ГНУ има бројна проширења изван ПОСИКС стандарда, и није више предњи крај дц (то је бајткод интерпретатор). 

ПОСИКС бц[уреди | уреди извор]

ПОСИКС стандардизовани бц језик традиционално написан као програм на дц програмском језику да обезбеди виши ниво приступа карактеристика дц језика без комплексности дц кратке синтаксе. 

У овој форми, бц програмски језик садржи појединачне променљиве, низове и имена функција и најстандардније аритметичке оператере као што су контрола протока конструкције, (if(cond)..., while(cond)... и for(init;cond;inc)...) од C. За разлику од C,  if не мора бити праћено са else.

Функције су дефинисане коришћењем речи define и вредности које се враћају њиховим коришћењем return праћене повратном вредношћу у заградама. Реч auto (опционална у C) је коришћена да декларише променљиву као локалну функцију.

Сви садржаји бројева и променљивих су произвољне прецизности бројева чије прецизности (у децималама) су одређене глобалним scale променљивама.

Нумеричка база улаза (у интерактивном режиму), излаза и програма константи може да се одреди постављањем резервисаних ibase (улазних база) и obase (излазних база) променљивих.

Излаз је генерисан од стране намерног недодељивања резултата израчунавања у променљивој.

Коментари се могу додати на бц код коришћењем C  /* и */ (почетак и крај коментара) симбола.

Математички оператери[уреди | уреди извор]

Exactly as C[уреди | уреди извор]

Следећи ПОСИКС бц оператери се понашају исто као њихове C колеге:

 +     -     *     /
 +=    -=    *=    /=
 ++    --    <     >
 ==    !=    <=    >=
 ( )   [ ]   { }

Слично 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 ексклузивне-или оператере, али су у ствари бц цели бројеви степенованих оператера.

Од посебног значаја, коришћење ^ оператера са негативним бројевима не прати предност C оператера. -2 ^ 2 бц даје одговор 4 чешће него -4.

"Недостајање" оператера у односу на C[уреди | уреди извор]

Булови и кондиционални оператери:

 &     |     ^     &&    ||
 &=    |=    ^=    &&=   ||=
<<    >>
<<=   >>=
?:

... нису могући у ПОСИКС бц.

Уграђене-у функције[уреди | уреди извор]

 sqrt() функција за израчунавање квадратног корена је ПОСИКС бц-ова функција само уграђена-у математичкој функцији. Друге функције су могуће у спољашњим стандардним библиотекама.

scale() функција за одређивање прецизности (као са scale променљивом) њихових аргумената и length() функција за одређивање броја значајних децимала у њиховим аргументима су такође уграђене-у.

Стандардне функције библиотеке[уреди | уреди извор]

Стандардна математичка библиотека бц-а (дефинисана са -Л опцијом) садржи функције за израчунавање синуса, косинуса, аркус тангенса, природног логаритма, експоненцијалне функције и два параметра Беселове функције Ј. Већина стандардних математичких функција (укључујући и друге инверзне тригонометријске функције) може бити изграђена коришћењем ових. Погледајте екстерне линкове за имплементацију многих других функција. 

-l опција мења обим до 20 (извора), тако да ствари као што су модул могу да раде неочекивано. На пример, писање "бц-Л", а затим команду  "пише 3%2" излаза 0. Али писање "обим=0" после "бц-Л"а онда команда "пише 3%2" ће избацити 1.

План 9 бц[уреди | уреди извор]

План 9 бц је као ПОСИКС бц али за додатне print изјаве.

ГНУ бц[уреди | уреди извор]

ГНУ бц произлази из ПОСИКС стандарда и укључује многа побољшања. Потпуно је одвојен од дц-основне имплементације ПОСИКС стандарда и уместо тога је писан у C. Ипак, је потпуно компатибилан као сви ПОСИКС бц програми који ће се покренути немодификовано као ГНУ бц програм. 

ГНУ бц променљиве, низови и имане функција могу да садрже више од једног карактера, неки оператери су више укључени из C, а нарочито if клаузула може бити праћена са else.

Излаз је постигнут или намерно недодељивањем резултата израчунавање променљивој (ПОСИКС начин) или помоћу додате print изјаве.

Поред тога, read изјава дозвољава интерактивни унос једног броја у већ покренут обрачун.

Поред коментара C-стила, # ће изазвати све после тога до следеће нове линије која ће се игнорисати.

Вредност последњег прорачуна увек се чува у додатној уграђеној last променљивој.

Екстра оператери[уреди | уреди извор]

Следећи логички оператери су наведени у ПОСИКС бц: 

&& || !

... и доступни су за употребу у условним исказима (као што је у оквиру if изјава). Напомена, међутим, да још увек нема еквивалентних додељивања операција. . 

Функције[уреди | уреди извор]

Све функције које су доступне у ГНУ бц су наслеђене од ПОСИКС-а . Нема више функција које су дате као стандарди са дистрибуцијом ГНУ. 

Пример кода[уреди | уреди извор]

Од када бц  ^ оператер дозвољава само цео број снаге на своје десно, једна од првих функција које би корисник бц могао да напише је функција снаге са покретним зарезом експонента. Оба испод претпостављају да је стандардна блиотека укључен: 

Функција "снаге" у ПОСИКС бц[уреди | уреди извор]

 /* Функција враћа цео број дела x */
 define i(x) {
    auto s
    s = scale
    scale = 0
    x /= 1   /* round x down */
    scale = s
    return (x)
 }

 /* Користе чињеницу да је x^y == e^(y*log(x)) */
 define p(x,y) {
    if (y == i(y)) {
       return (x ^ y)
    }
    return ( e( y * l(x) ) )
 }

Еквивалентна "снага" функција у ГНУ бц[уреди | уреди извор]

 # Функција која враћа целобројни део броја
 define int(number) {
    auto oldscale
    oldscale = scale
    scale = 0
    number /= 1 /* round number down */
    scale = oldscale
    return number
 }
 
 # Користе чињеницу да је number^exponent == e^(exponent*log(number))
 define power(number,exponent) {
    if (exponent == int(exponent)) {
       return number ^ int(exponent)
    } else {
       return e( exponent * l(number) )
    }
 }

Израчунавање Пи-а до хиљаду места[уреди | уреди извор]

Израчунајте пи користећи уграђену аркус тангенс функцију, a().

$ bc -lq
scale=10000
4*a(1) # Атан 1 је 45 степени, што је Пи/4 у радијанима.
       # Ово ће можда потрајати неколико минута док се израчуна.

Преведена C функција[уреди | уреди извор]

Зато што је синтакса БЦ слична оној од Ц, објављене нумеричке функције написане у C се често могу превести у бц прилично лако, који одмах даје произвољну прецизност БЦ. На пример, у часопису статистичког софтвера (јула 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);
}

Са неким неопходним променама да прихвати БЦ другачију синтаксу, а схватајући да је константа "0,9189 ... " заправо log(2*Пи)/2, то сe може превести на следећи ГНУ бц код:

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)
}

Коришћење бц у скриптама[уреди | уреди извор]

бц се може користити не-интерактивно, са улазима преко цеви. Ово је корисно у скриптама. На пример: 

$ result=$(echo "scale=2; 5 * 7 /3;" | bc)
$ echo $result
11.66

Насупрот томе, имајте на уму да Баш ћелија једина обавља аритметику целих бројев, нпр: 

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

Такође се може користити хир- стринг идиомом (у баш, кш, цш)

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

Види још[уреди | уреди извор]

Референце[уреди | уреди извор]

  1. ^ bc: arbitrary-precision arithmetic language – Commands & Utilities Reference, The Single UNIX® Specification, Issue 7 from The Open Group
  2. ^ GNU bc manual page

Спољашње везе[уреди | уреди извор]