Bc (programmeringsspråk)

bc er et programmeringsspråk for vilkårlig presisjon numerisk beregning , med syntaks som ligner på C-programmeringsspråket .

Språket og dets tolk er et standardisert verktøy på UNIX - systemer .

Bc-tolken kan brukes interaktivt ved å skrive uttrykk som (1 + 3) * 2 som evalueres og verdien skrives til standardutdata (8 i eksemplet ovenfor).

Det er for tiden to hoveddialekter : den tett definerte POSIX bc og dens direkte etterkommer, GNU bc, som inneholder en rekke utvidelser.

bc tillater definisjon av matematiske funksjoner . Videre inkluderer bc-implementeringer et matematisk bibliotek med forhåndsdefinerte (og standardiserte) funksjoner som cosinus eller Bessel-funksjon .

Den har også strukturer som tillater strukturert programmering som løkker eller betingede beslutninger.

Historikk

bc dukket først opp i Unix versjon 6 i 1975 og ble skrevet av Robert Morris og Lorinda Cherry fra Bell Labs. bc ble innledet av dc, en tidligere vilkårlig presisjonskalkulator skrevet av de samme forfatterne. dc kunne utføre beregninger med vilkårlig presisjon, men dens omvendt polske notasjon (RPN) syntaks, mye verdsatt av mange for å evaluere algebraiske formler, viste seg å være upraktisk for brukerne når de uttrykker kontrollflyt, og derfor ble bc skrevet som et grensesnitt for dc. bc var en veldig enkel kompilator (en enkelt yacc-kildefil med noen få hundre linjer), som konverterte den nye C-lignende bc-syntaksen til dc's postfix-notasjon og ledet resultatene gjennom dc.

I 1991 ble POSIX strengt definert og standardisert f.Kr. Tre implementeringer av denne standarden overlever i dag: den første er den tradisjonelle Unix-implementeringen, en front-end for dc, som overlever på Unix- og Plan 9-systemer. Den andre er gratisprogramvaren GNU bc, først utgitt i 1991 av Philip A.Nelson . GNU-implementeringen har mange utvidelser utover POSIX-standarden og er ikke lenger en front-end for dc (det er en bytekode-tolker). Den tredje er en reimplementering av OpenBSD i 2003.

Eksempler

Enkle beregninger

f.Kr 5+2*3 ^D

Noe litt mer komplekst:

f.Kr b=1 for (a=5;a>1;a--) b=b*a ^D

Heltalls- og eksponentielle delfunksjoner

Deretter vil vi introdusere to funksjoner, i og p . i -funksjonen returnerer heltallsdelen av et hvilket som helst tall ; og funksjonen p (som er basert på forrige funksjon) beregner:

lar y være et hvilket som helst tall (ikke bare et heltall ).

/* En funksjon som returnerer heltallsdelen av x */ definer i (( x )) { auto s s = skala skala = 0 x /= 1 /* rund x */ skala = s retur ( x ) } /* x^y == e^(y*log(x)) */ definer p ( x , y ) { if ( y == i ( y ) ) { return ( x ^ y ) } return ( e ( y * l ( x ) ) ) }

Beregning av π med 10000 sifre

Beregn pi ved å bruke den innebygde arctangens -funksjonen , a():

$ bc -lq skala=10000 4*a(1) # Atan til 1 er 45 grader, som er pi/4 i radianer. # Dette kan ta flere minutter å beregne.

Oversatt C-funksjon

Fordi syntaksen til bc er lik den til C , kan numeriske funksjoner skrevet i C ofte oversettes til bc ganske enkelt. For eksempel følgende C-kode for den kumulative normalfordelingen:

dobbel Phi ( dobbel x ) { lang dobbel s = x , t = 0 , b = x , q = x * x , i = 1 ; mens ( s != t ) s = ( t = s ) + ( b *= q / ( i += 2 )); return .5 + s * exp ( -.5 * q -.91893853320467274178L ); }

Med noen endringer som trengs for å imøtekomme den forskjellige bc-syntaksen, og med tanke på at konstanten "0.9189 ..." faktisk er log(2 * PI) / 2, kan dette oversettes til følgende GNU bc-kode:

definer phi ( x ) { auto s , t , b , q , i , const s = x ; t = 0 ; b = x ; q = x * x ; i = 1 mens ( s != t ) s = ( t = s ) + ( b *= q / ( i += 2 )) const = 0,5 * l ( 8 * a ( 1 )) # 0,91893 ... retur .5 + s * e ( - .5 * q - const ) }

Bruke bc i shell-skript

bc kan brukes ikke-interaktivt. Dette er nyttig i shell-skript . For eksempel:

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

I motsetning, merk at bash-skallet bare utfører heltallsaritmetikk. For eksempel:

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

Du kan også bruke Here-dokumentet (i bash, ksh, csh):

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

Som i forrige tilfelle, men med to desimaler:

$ bc -l <<< "scale=2; 5*7/3" 11,66

Referanser

Eksterne lenker