Ez a dokumentum egy előző változata!
A bc egy lebegőpontos számológép:
palferi@lizi:~$ bc bc 1.06.95 Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc. This is free software with ABSOLUTELY NO WARRANTY. For details type `warranty'. scale=12 1/27+(3^5) 243.037037037037 last-32 211.037037037037 sqrt(134) 11.575836902790 quit
Láthatjuk, hogy a scale
a pontosságot állítja be, használhatjuk az alapvető számtani műveleteket, a last
a legutolsó eredményt jelenti, az sqrt()
pedig a négyzetgyök kiszámítása. A quit
paranccsal lépünk ki aprogramból.
Ha a bc-t
a -l
opcióval indítjuk, a matematikai könyvtár betöltődik, és a pontosság 20-as lesz. A matematikai függvények azzal a pontossággal számolják ki az eredményt, amely a meghívásukkor be volt állítva. A matematikai könyvtár a következő függvényeket definiálja:
s(x) | Az x (radián) szinusza |
c(x) | Az x (radián) koszínusza |
a(x) | Az x arkusz tangense |
l(x) | Az x természetes logaritmusa |
e(x) | Az e x-edik hatványa |
j(n,x) | Az n-ed rendű Bessel fuggvenye x-nek |
Számítsuk ki a π szám értékét 20, majd 1000 számjegy pontossággal:
palferi@lizi:~$ bc -l bc 1.06.95 Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc. This is free software with ABSOLUTELY NO WARRANTY. For details type `warranty'. 4*a(1) 3.14159265358979323844 scale=1000 4*a(1) 3.141592653589793238462643383279502884197169399375105820974944592307\ 81640628620899862803482534211706798214808651328230664709384460955058\ 22317253594081284811174502841027019385211055596446229489549303819644\ 28810975665933446128475648233786783165271201909145648566923460348610\ 45432664821339360726024914127372458700660631558817488152092096282925\ 40917153643678925903600113305305488204665213841469519415116094330572\ 70365759591953092186117381932611793105118548074462379962749567351885\ 75272489122793818301194912983367336244065664308602139494639522473719\ 07021798609437027705392171762931767523846748184676694051320005681271\ 45263560827785771342757789609173637178721468440901224953430146549585\ 37105079227968925892354201995611212902196086403441815981362977477130\ 99605187072113499999983729780499510597317328160963185950244594553469\ 08302642522308253344685035261931188171010003137838752886587533208381\ 42061717766914730359825349042875546873115956286388235378759375195778\ 18577805321712268066130019278766111959092164201988 quit
Shell szkriptben vagy parancssorból közvetlenül is meghívhatjuk a bc
programot az echo
parancs és csővezeték segítségével:
palferi@lizi:~$ echo "scale=30; 4*a(1)" | bc -l 3.141592653589793238462643383276 palferi@lizi:~$ echo "scale=30; sqrt(42)+27" | bc 33.480740698407860230965967436087
A time
paranccsal meghatározhatjuk a számításra fordított időt. Nagyobb pontosság megadásával meghatározhatjuk gépünk sebességét, összehasonlíthatjuk más gépekével. Vegyük figyelembe viszont, hogy a bc
program csak egy processzormagot használ. A következő parancs 5000 tizedesjegy pontossággal határozza meg a π számot, kiírja az erre fordított processzoridőt és processzor fontosabb paramétereit:
palferi@lizi:~$ time echo "scale=5000; 4*a(1)" | bc -l ; cat /proc/cpuinfo | grep -E '(model name|bogomips|MHz)' 3.141592653589793238462643383279502884197169399375105820974944592307\ 81640628620899862803482534211706798214808651328230664709384460955058\ ... 74351362222477158915049530984448933309634087807693259939780541934144\ 73774418426312986080998886874132604720 real 0m20.903s user 0m20.885s sys 0m0.004s model name : Intel(R) Core(TM) i5-3330 CPU @ 3.00GHz cpu MHz : 3001.000 bogomips : 5986.03 model name : Intel(R) Core(TM) i5-3330 CPU @ 3.00GHz cpu MHz : 1600.000 bogomips : 5986.03 model name : Intel(R) Core(TM) i5-3330 CPU @ 3.00GHz cpu MHz : 1600.000 bogomips : 5986.03 model name : Intel(R) Core(TM) i5-3330 CPU @ 3.00GHz cpu MHz : 1600.000 bogomips : 5986.03
Írjon szkriptet megy.sc
néven ami a másodfokú egyenlet gyökeit keresi meg. Az a, b, c együtthatókat paraméterként adja meg.
A másodfokú egyenlet megoldóképlete:
$$x_{1,2} = \frac{ -b \pm \sqrt{b^2 - 4ac} }{ 2a}$$
A $b^2 - 4ac$ kifejezést diszkriminánsnak nevezzük. Határozzuk meg a diszkriminánst:
#!/bin/bash echo "Az ax^2+bc+c=0 egyenlet megoldása" A=$1; B=$2; C=$3 DR=`echo "scale=4; $B^2-4*$A*$C" | bc` echo "Diszkrimináns: $DR"
Amennyiben a diszkrimináns nulla, kiszámítjuk a gyököt (kettős gyök) és kilépünk az exit 0
paranccsal a programból:
if test $DR -eq 0 then echo "A másodfokú egyenletnek egy valós (kettős) gyöke van:" X12=`echo "scale=4; -$B/(2*$A)" | bc` echo $X12 exit 0 fi
A programot olyan paraméterekkel indítva, amelyekkel a diszkrimináns nulla:
palferi@lizi:~$ ./megy.sc 2 4 2 Az ax^2+bc+c=0 egyenlet megoldása Diszkrimináns: 0 A másodfokú egyenletnek egy valós (kettős) gyöke van: -1.0000
Amennyiben a diszkrimináns negatív, az egyenletnek nincsenek valós gyökei:
if test $DR -lt 0 then echo "A másodfokú egyenletnek nincsenek valós gyökei" exit 0 fi
Minden más esetben:
echo "A másodfokú egyenlet gyökei:" X1=`echo "scale=4; (-$B+sqrt($DR))/(2*$A)" | bc` X2=`echo "scale=4; (-$B-sqrt($DR))/(2*$A)" | bc` echo "X1=$X1" echo "X2=$X2"
Ne feledjük, hogy a szkript csak egész számokkal működik helyesen és az a együttható nem lehet nulla.
Írjon szkriptet fsin.sc
néven ami a paraméterébe megadott fokérték szinuszát számítja ki 24 tizedesjegy pontossággal. A program ellenőrizze, hogy csak egy egész szám paramétert kapott és a paraméter nem kisebb mint
-360 és nem nagyobb 360.
#!/bin/bash if [ $# -eq 1 ] then P1=`echo $1 | grep -E '^[0-9-]?[0-9]+$'` if [ -n "$P1" ] then if [ $1 -gt -360 ] && [ $1 -lt 360 ] then SIN=`echo "scale=24; s(((4*a(1))/180)*$1)" | bc -l` echo "sin($1)=$SIN" else echo "A paraméter étréke nem -360 és 360 között van." fi else echo "A paraméter nem egész szám" fi else echo "Egy paramétert kell megadni!" fi
A programban először azt ellenőrizzük, hogy egy paramétert adtunk meg, majd reguláris kifejezéssel, hogy egész számot. A P1 változó értéke csak akkor lesz nem nulla hosszúságú karakterlánc, ha egész számot adunk meg paraméterként.
A [ $1 -gt -360 ] && [ $1 -lt 360 ]
kifejezés csak akkor lesz igaz, ha két feltételnek is megfelel a paraméter. A radiánra való átszámításnál pi/180-al szorozzuk a fokértéket. Ellenőrizzük a szkript működését különböző paraméterekkel:
palferi@lizi:~/proba$ ./fsin.sc 87 sin(87)=.998629534754573873784487 palferi@lizi:~/proba$ ./fsin.sc --130 A paraméter nem egész szám palferi@lizi:~/proba$ ./fsin.sc 391 A paraméter étréke nem -360 és 360 között van.