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

Из Википедије, слободне енциклопедије
Jump to navigation Jump to search

бц, за основни калкулатор (који се често назива клупа калкулатор), је "произвољне прецизности калкулатор" са синтаксом сличном Ц програмском језику. бц се обично користи као математичка скрипта језика или као интерактивна математичка љуска.[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

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