bc(1) bc(1)
NAME
bc - Arithmetische Sprache
SYNTAX
bc [-c] [-d] [-l] [--] [datei]...
BESCHREIBUNG
Mit bc können Sie rechnen. bc ist ein interaktives Programm für eine
C-ähnliche Eingabesprache; bc ist eigentlich ein Präprozessor für
dc(1); bc ruft den Tischrechner dc automatisch auf und gibt die Ergeb-
nisse mit beliebiger Genauigkeit auf die Standardausgabe aus.
OPTIONEN
-c
-d (c - compile only) bc erzeugt nur Anweisungen für den Tischrech-
ner dc und gibt diese auf die Standardausgabe aus. bc ruft dc
jedoch nicht auf. Die Option -d hat die gleiche Wirkung wie die
Option -c.
-l -l steht für /usr/lib/lib.b. In dieser Bibliothek sind bc-Pro-
gramme für verschiedene mathematische Funktionen enthalten.
Sie müssen die Option -l angeben, wenn Sie eine der folgenden
Funktionen verwenden:
s(x) Sinus
c(x) Cosinus
e(x) Exponentialfunktion mit Basis e
l(x) natürlicher Logarithmus
a(x) Arcustangens
j(n,x) Bessel-Funktion n-ter Ordnung
-- Ende der Optionenliste. Die Angabe ist nötig, wenn datei mit -
beginnt.
datei
Name der Datei mit einem bc-Programm. Sie können mehrere Dateien
angeben. Nachdem alle Anweisungen aus allen Dateien abgearbeitet
sind, liest bc von der Standardeingabe. Sie können dann weitere
Anweisungen eingeben.
datei nicht angegeben: bc liest von der Standardeingabe.
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
bc(1) bc(1)
ELEMENTE VON BC-PROGRAMMEN
Ein bc-Programm besteht aus
- Definitionen
- Anweisungen
- Kommentaren
Bei der Beschreibung des Aufbaus von bc-Programmen werden folgende
Bezeichnungen verwendet:
L (L - letter) steht für einen der Buchstaben a - z
E (E - expression) steht für einen Ausdruck
S (S - statement) steht für eine Anweisung
Kommentare
Kommentare werden wie in C-Programmen in /* ... */ eingeschlossen.
Anweisungen
Anweisungen in bc-Programmen können sein:
⊕ Ausdrücke (siehe Ausdrücke)
Das Ergebnis einer Anweisung, die ein Ausdruck ist, wird ausgege-
ben, es sei denn, der Hauptoperator ist ein Zuweisungsoperator.
⊕ Blöcke: {S; ...; S}
⊕ Auswahlanweisung: if (E) S
Wenn der Ausdruck E wahr ist, d. h. einen Wert ungleich 0 hat, dann
wird die Anweisung S ausgeführt.
⊕ Wiederholungsanweisungen:
- while (E) S
Der Ausdruck E wird ausgewertet und wenn sein Wert ungleich 0
ist, dann wird die Anweisung L ausgeführt. Danach wird E erneut
ausgewertet und S gegebenenfalls wiederum ausgeführt. Dies wie-
derholt sich, solange der Wert von E ungleich 0 ist.
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98
bc(1) bc(1)
- for (E; E; E) S
Zuerst wird der erste Ausdruck ausgewertet. Danach wird der
zweite Ausdruck ausgewertet und falls dessen Wert ungleich 0
ist, wird die Anweisung S ausgeführt. Schließlich wird der
dritte Ausdruck ausgewertet. Anschließend wird wieder der zweite
Ausdruck ausgewertet und gegebenenfalls Anweisung S ausgeführt
usw. Anders als in C-Programmen muß eine for-Anweisung immer
drei Ausdrücke enthalten.
⊕ Sprunganweisung: break
Die Anweisung break darf nur innerhalb einer Wiederholungsanweisung
benutzt werden. Sie sorgt für den Abbruch der nächstgelegenen
while- oder for-Anweisung. Das Programm wird mit der Anweisung
fortgesetzt, die auf die abgebrochene Wiederholungsanweisung folgt.
⊕ Abbruchanweisung: quit
Die Anweisung quit beendet die Ausführung des bc-Programms. quit
wird sofort beim Einlesen interpretiert, nicht erst bei der Ausfüh-
rung des bc-Programms.
Beispiel:
Das folgende bc-Programm beendet sich sofort, ohne daß der Wert von
a ausgegeben wird:
a=5
if (a>10) quit
(a)
Anweisungen können Sie durch einen Strichpunkt oder ein Neue-Zeile-
Zeichen voneinander trennen.
Ausdrücke
Ausdrücke bestehen aus Operanden und Operatoren.
Operanden sind Namen oder beliebig lange Zahlen, wahlweise mit Vorzei-
chen und Dezimalpunkt.
Namen
L einfache Variablen
L Funktionsnamen
L[E] Feldelemente
ibase Basis für eingelesene Zahlen, Standard (keine Angabe): 10
Seite 3 Reliant UNIX 5.44 Gedruckt 11/98
bc(1) bc(1)
obase Basis für ausgegebene Zahlen, Standard (keine Angabe): 10
scale Anzahl der Nachkommastellen, Standard (keine Angabe): 0
Wenn Felder als Argumente einer Funktion verwendet oder als auto-
Variablen definiert werden, so müssen Sie hinter den Namen des Feldes
leere eckige Klammern schreiben.
Eine einfache Variable, ein Feld und eine Funktion können denselben
Namen haben.
Alle Variablen sind global im ganzen bc-Programm gültig.
Weitere Operanden
(E) Ergebnis von E
sqrt(E) Quadratwurzel von E
length(E) Zahl der signifikanten Dezimalziffern von E
scale(E) Zahl der Nachkommastellen von E
L(E, ...,E)
Operatoren
+ - * / Addition, Subtraktion, Multiplikation, Division
^ Potenzieren
% Rest bei ganzzahliger Division (Modulo), kann jedoch auch
für Gleitkommazahlen verwendet werden.
++ -- Inkrement- und Dekrement-Operator, die sowohl in Präfix-
wie in Postfix-Notation auf Namen angewendet werden können
< <= == >= > !=
Vergleichsoperatoren (echt kleiner, kleiner gleich,
gleich, größer gleich, echt größer, ungleich)
= Zuweisungsoperator
=@ zusammengesetzte Zuweisungsoperatoren; dabei bedeutet a=@b
dasselbe wie a=a@b. Für @ können Sie einen der Operatoren
+, -, *, /, ^ oder % angeben.
Die logischen Operatoren && und || stehen in bc nicht zur Verfügung.
Seite 4 Reliant UNIX 5.44 Gedruckt 11/98
bc(1) bc(1)
Definition von Funktionen
define L (L, ...,L) {
auto L, ...,L
S; ...;S
return (E)
}
Beispiel:
define p(x) {
auto q
q = p * p
return (q)
}
Indem die Ergebnisparameter einer Funktion als auto vereinbart werden,
wird ihr Gültigkeitsbereich auf diese Funktion beschränkt. Alle Funk-
tionsargumente werden als Werte übergeben.
Funktionen in der mathematischen Bibliothek /usr/lib/lib.b
In /usr/lib/lib.b sind Definitionen der folgenden mathematischen Funk-
tionen enthalten. Sie stehen Ihnen zur Verfügung, wenn Sie bc mit der
Option -l aufrufen:
s(x) Sinus
c(x) Cosinus
e(x) Exponentialfunktion mit Basis e
l(x) natürlicher Logarithmus
a(x) Arcustangens
j(n,x) Bessel-Funktion n-ter Ordnung
Die Werte für x müssen im absoluten Bogenmaß angegeben werden.
Wenn Sie Schreibrecht für die Datei /usr/lib/lib.b haben, können Sie
die Definitionen weiterer Funktionen hinzufügen oder vorhandene Defi-
nitionen abändern oder löschen.
Seite 5 Reliant UNIX 5.44 Gedruckt 11/98
bc(1) bc(1)
Basis für Ein- und Ausgaben festlegen
Mit ibase und obase legen Sie fest, in welchem Zahlensystem eingege-
bene bzw. ausgegebene Werte interpretiert werden. Dabei gelten fol-
gende Regeln:
1. Wenn Sie ibase oder obase nicht explizit einen Wert zuweisen, wer-
den eingegebene Zahlen im Dezimalsystem interpretiert und Ergeb-
nisse im Dezimalsystem ausgegeben.
2. Wenn Sie mit der Anweisung ibase=n eine Basis für Eingaben festge-
legt haben, müssen Sie die gewünschte Basis für Ausgaben in der
Anweisung obase=m schon in der Eingabe-Basis n darstellen.
Beispiel:
Basis für Eingaben soll 2, Basis für Ausgaben soll 16 sein:
$ bc
ibase=2
obase=10000
10100000/1010
10
Nachkommastellen
Jedem Ausdruck E in bc ist eine Zahl von Nachkommastellen zugeordnet.
Diese Zahl können Sie mit scale ändern und abfragen oder mit der Funk-
tion scale(E) abfragen.
Beispiel:
Im folgenden Beispiel werden zunächst die Werte zweier Operanden a
und b dividiert, ohne daß scale gesetzt wurde: das Ergebnis hat
keine Nachkommastellen. Dann wird scale der Wert 8 zugewiesen: das
Ergebnis der Division ist nun auf 8 Stellen nach dem Komma genau.
Anschließend wird die Anzahl der Nachkommastellen des Ergebnisses
und der Wert von scale abgefragt.
$ bc
a=15.0
b=7.8
a/b
1
scale=8
a/b
1.92307692
scale(a/b)
8
scale
8
Seite 6 Reliant UNIX 5.44 Gedruckt 11/98
bc(1) bc(1)
Wenn Sie zwei Ausdrücke durch einen Operator verknüpfen, wird die dem
Ergebnis zugeordnete Anzahl von Nachkommastellen durch eine Regel
bestimmt, die für den Operator spezifisch ist. Im folgenden werden die
Regeln für die bc-Operatoren beschrieben. Dabei werden einige Abkür-
zungen verwendet:
a = erster Operand
b = zweiter Operand
R Anzahl der Nachkommastellen des Ergebnisses einer Rechenoperation
A = scale(a)
B = scale(b)
-
++
-- Das unäre Minuszeichen sowie die Inkrement- und Dekrement-Opera-
toren ++ und -- (in Präfix- und Postfix-Notation) ändern die Zahl
der Nachkommastellen nicht.
Regel: scale(E) = scale(-E) = scale(--E) = scale(++E)...
Beispiel:
a erhält einen Wert mit drei Nachkommastellen. Die Funktionsab-
frage scale(a) ergibt hier immer die 3, unabhängig davon, ob a
mit einem der Operatoren -, -- oder ++ versehen wird und unabhän-
gig davon, daß scale vorher ein anderer Wert zugewiesen wurde:
$ bc
scale=1
a=1.123
scale(a)
3
scale(-a)
-3
scale(a++)
3
scale(--a)
3
+
- Für die binären Operatoren + und - ist R gleich der Anzahl der
Stellen des Operanden, der die meisten Nachkommastellen hat.
Dabei spielt es keine Rolle, ob Sie scale zuvor einen anderen
Wert zugewiesen haben.
Regel: R = max(A,B)
Seite 7 Reliant UNIX 5.44 Gedruckt 11/98
bc(1) bc(1)
Beispiel:
scale erhält den Wert 1. a wird ein Wert mit zwei Nachkommastel-
len, dem Operanden b ein Wert mit drei Nachkommastellen zugewie-
sen. b hat also mehr Stellen als a, aber auch mehr als scale. Die
Funktionsabfrage ergibt für beide Operanden 3, das ist die Anzahl
der Nachkommastellen von b.
$ bc
scale=1
a=0.12
b=0.123
scale(a+b)
3
scale(b-a)
3
* Bei einer Multiplikation spielt ein zuvor gesetzter Wert von
scale eine Rolle: bc ermittelt zunächst den höchsten Wert max aus
den Werten von scale, A und B. Anschließend bildet bc die Summe
von A und B. R ist dann der kleinere Wert aus dem Vergleich von
max und dieser Summe.
Regel: R = min(A+B, max(scale, A, B))
Beispiel:
scale hat den Wert 9, A und B haben jeweils den Wert 1. Der höch-
ste Wert ist also 9. Die Summe der Nachkommastellen der Operanden
ist 2. Die Anzahl Nachkommastellen des Ergebnisses der Multipli-
kation ist der kleinere Wert aus max und der Summe, also 2.
$ bc
scale=9
a=0.1
b=0.1
scale(a*b)
2
/ Bei einer Division bestimmt ausschließlich der Wert von scale die
Genauigkeit des Ergebnisses:
Regel: R = scale
Beispiel:
Zunächst erhält scale den Wert 8. Anschließend werden den Operan-
den ganze Zahlen zugewiesen. Das Ergebnis ist wieder eine ganze
Zahl. Trotzdem ergibt die Funktionsabfrage 8, und das Ergebnis
wird auf 8 Stellen hinter dem Komma genau ausgegeben.
Seite 8 Reliant UNIX 5.44 Gedruckt 11/98
bc(1) bc(1)
$ bc
scale=8
a=16
b=4
scale(a/b)
8
a/b
4.00000000
^ Beim Potenzieren berechnet sich R wie folgt:
- wenn der ganzzahlige Exponent e >= 0 ist:
bc ermittelt den höchsten Wert max aus den Werten von scale
und A. Anschließend multipliziert es A mit dem Betrag m des
Exponenten, vergleicht das Ergebnis mit max und nimmt von bei-
den den kleineren Wert.
Regel: R = min(A*m, max(scale, A))
- wenn der ganzzahlige Exponent e < 0 ist:
Die Anzahl Nachkommastellen des Ergebnisses entspricht dem
Wert von scale.
Regel: R = scale
Beispiel 1
scale erhält den Wert 7. a hat eine Nachkommastelle, und der
Betrag des Exponenten e ist 4, also größer als 0. Der höchste
Wert von scale und a ist 7. Das Ergebnis der Multiplikation aus a
und m ist jedoch 4. Die Anzahl der Nachkommastellen des Potenzie-
rens ist also 4:
$ bc
scale=7
a=3.1
e=4
scale(a^e)
4
a^e
92.3512
Seite 9 Reliant UNIX 5.44 Gedruckt 11/98
bc(1) bc(1)
Beispiel 2
Wenn Sie für den Exponenten e jedoch -4 angeben, ist die Anzahl
der Nachkommastellen der Wert von scale:
$ bc
scale=7
a=3.1
e=-4
scale(a^e)
7
a^e
.0108281
=
=@ Bei den Zuweisungsoperatoren entspricht der Wert von R demjenigen
von A nach der Zuweisung. Dabei gilt für einen zusammengesetzten
Operator =@ jeweils die gleiche Regel zur Berechnung der Anzahl
von Nachkommastellen, wie für den einfachen Operator @.
Regeln: R = scale(b) und R = scale(a@b)
Beispiel 1
a wird eine Zahl mit einer Nachkommastelle, b eine mit zwei Nach-
kommastellen zugewiesen: scale(a) ist 1 und scale(b) ist 2. Fra-
gen Sie nach der Zuweisung der Operanden scale(a) ab, so gibt bc
den Wert 2 aus, also scale(b). Wenn Sie anschließend noch a
abfragen, erhalten Sie den zugewiesenen Wert von b:
$ bc
a=0.1
b=0.12
scale(a)
1
scale(b)
2
a=b
scale(a)
2
a
.12
Beispiel 2
a wird eine Zahl mit zwei und b eine Zahl mit drei Nachkommastel-
len zugewiesen. Beim Funktionsaufruf wird a der Wert der Addition
der beiden Operatoren zugewiesen. Für bc ist die Anzahl Nachkom-
mastellen eines Additionsergebnisses gleich der Anzahl Stellen
desjenigen Operanden, der die meisten Stellen hat. a hat nach der
Zuweisung ebensoviele Stellen, also drei:
Seite 10 Reliant UNIX 5.44 Gedruckt 11/98
bc(1) bc(1)
$ bc
a=0.12
a=0.123
scale(a)
2
scale(b)
3
a=+b
scale(a)
3
a
.243
% Ist bei einer %-Berechnung der Wert von scale ungleich 0, so
errechnet sich das Ergebnis folgendermaßen:
a%b = a - (a / b) * b
Dabei wird zunächst die Division mit der Genauigkeit von scale
berechnet. Die Genauigkeit der Multiplikation mit b beträgt:
scale + B
Das heißt, daß die Multiplikation exakt ausgeführt wird. Der %-
Operator kann hier also als Maß der Genauigkeit verwendet werden,
mit der die Division durchgeführt wird.
R schließlich ist der höchste Wert aus A und dem Additionsergeb-
nis von scale und B.
Regel: R = max((scale + B), A)
Beispiel:
scale hat den Wert 4, a und b haben jeweils eine Nachkommastelle.
Das Ergebnis der %-Berechnung hat fünf Nachkommastellen:
$ bc
scale=4
a=1.2
b=1.1
scale(a%b)
5
a%b
.00001
ENDE-STATUS
0 Alle Eingabedateien wurden erfolgreich abgearbeitet
ungleich 0
Bei der Ausführung von bc ist ein Fehler aufgetreten
Seite 11 Reliant UNIX 5.44 Gedruckt 11/98
bc(1) bc(1)
INTERNATIONALE UMGEBUNG
Die Umgebungsvariable LCMESSAGES bestimmt die Sprache der Meldungs-
texte. Wenn LCMESSAGES nicht oder als leere Zeichenkette definiert
ist, wird der Wert von LANG als Standardwert herangezogen. Ist auch
LANG nicht oder als leere Zeichenkette definiert, verhält sich das
System so, als wäre es nicht internationalisiert.
Die Umgebungsvariable LCALL bestimmt die gesamte internationale Umge-
bung. LCALL hat Vorrang vor allen anderen Umgebungsvariablen im
Bereich der Internationalisierung.
BEISPIELE
Beispiel 1
Zahlen addieren, subtrahieren, multiplizieren, dividieren. Nicht ganz-
zahlige Ergebnisse sollen mit zwei Nachkommastellen ausgegeben werden:
$ bc
scale=2
3+7
10
8-15
-7
7*6
42
3/5
.60
quit
$
Beispiel 2
Definition einer Funktion, die angenähert den Wert der Exponential-
funktion berechnet.
scale=20
define e(x){
auto a, b, c, i, s
a = 1
b = 1
s = 1
for(i=1;1==1;i++){
a = a*x
b = b*i
c = a/b
if(c==0) return (s)
s = s+c
}
}
Seite 12 Reliant UNIX 5.44 Gedruckt 11/98
bc(1) bc(1)
Das Abbruchkriterium der for-Schleife ist im Schleifenrumpf enthalten
[if(c==0)] und wird nicht, wie sonst üblich, durch den zweiten Aus-
druck der for-Anweisung gegeben. In einem C-Programm würde man den
zweiten Ausdruck der for-Anweisung in einem solchen Fall einfach weg-
lassen. Die for-Anweisung in einem bc-Programm muß jedoch immer drei
Ausdrücke enthalten. Daher wird hier der Ausdruck 1==1 eingefügt, der
immer wahr ist.
Beispiel 3
Ausgeben der angenäherten Werte der Exponentialfunktion für die ersten
10 natürlichen Zahlen.
for(i=1;i<=10;i++) e(i)
Beispiel 4
Die Quadrate der ersten vier natürlichen Zahlen ausgeben:
$ bc
for(i=1;i<5;i++) {i*i}
1
4
9
16
quit
Beispiel 5
Ausgeben der Eingabe für dc beim Errechnen der Quadratzahlen von 1 bis
4.
Eingabe:
$ bc -c
for(i=1;i<5;i++) {i*i}
Ausgabe:
[lili*ps.lid1+sis.li 5>0]s0
1dsis.li 5>0
DATEIEN
/usr/lib/lib.b
Mathematische Bibliothek
/usr/bin/dc
Tischrechner-Programm
SIEHE AUCH
dc(1).
Seite 13 Reliant UNIX 5.44 Gedruckt 11/98