Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

bc - Arithmetische Sprache

&pagelevel(4)&pagelevel

(arbitrary-precision arithmetic language)


Mit bc können Sie rechnen. bc ist ein interaktives Programm für eine C-ähnliche Eingabe-Sprache.

Syntax


bc [ -l ][ datei ...]

-l

-l steht für /usr/lib/lib.b. In dieser Bibliothek sind bc-Programme 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

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 Standard-Eingabe. Sie können dann weitere Anweisungen eingeben.

datei nicht angegeben:
bc liest von der Standard-Eingabe.

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 ausgegeben, 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 S ausgeführt. Danach wird E erneut ausgewertet und S ggf. wiederum ausgeführt. Dies wiederholt sich, solange der Wert von E ungleich 0 ist.

    • 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 muss 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ührung des bc-Programms.

Anweisungen können Sie durch einen Strichpunkt oder ein Neue-Zeile-Zeichen voneinander trennen.

Beispiel

Das folgende bc-Programm beendet sich sofort, ohne dass der Wert von a ausgegeben wird:

a=5
if (a>10) quit
a)

Ausdrücke

Ausdrücke bestehen aus Operanden und Operatoren.

Operanden sind Namen oder beliebig lange Zahlen, wahlweise mit Vorzeichen und Dezimalpunkt.

Namen

Leinfache Variablen
LFunktionsnamen
L[E]Feldelemente
ibaseBasis für eingelesene Zahlen, Standard (keine Angabe): 10
obaseBasis für ausgegebene Zahlen, Standard (keine Angabe): 10
scaleAnzahl 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.

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

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.

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 Funktionsargumente werden als Werte übergeben.

Funktionen in der mathematischen Bibliothek /usr/lib/lib.b

In /usr/lib/lib.b sind Definitionen der folgenden mathematischen Funktionen 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 Definitionen abändern oder löschen.

Basis für Ein- und Ausgaben festlegen

Mit ibase und obase legen Sie fest, in welchem Zahlensystem eingegebene bzw. ausgegebene Werte interpretiert werden. Dabei gelten folgende Regeln:

  1. Wenn Sie ibase oder obase nicht explizit einen Wert zuweisen, werden eingegebene Zahlen im Dezimalsystem interpretiert und Ergebnisse im Dezimalsystem ausgegeben.

  2. Wenn Sie mit der Anweisung ibase = n eine Basis für Eingaben festgelegt 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 der Variablen scale ändern und abfragen oder mit der Funktion scale(E) abfragen.

Beispiel

Im folgenden Beispiel werden zunächst die Werte zweier Operanden a und b dividiert, ohne dass die Variable 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

CTRL+D oder @@d

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ürzungen 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-Operatoren ++ 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 Funktionsabfrage scale(a) ergibt hier immer die 3, unabhängig davon, ob a mit einem der Operatoren -, -- oder ++ versehen wird und unabhängig davon, dass 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

CTRL+D oder @@d


+

-

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)

Beispiel

Die Variable scale erhält den Wert 1. a wird ein Wert mit zwei Nachkommastellen, dem Operanden b ein Wert mit drei Nachkommastellen zugewiesen. 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

CTRL+D oder @@d


*   

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öchste Wert ist also 9. Die Summe der Nachkommastellen der Operanden ist 2. Die Anzahl Nachkommastellen des Ergebnisses der Multiplikation ist der kleinere Wert aus max und der Summe, also 2.


$ bc

scale=9

a=0.1

b=0.1

scale(a*b)

2

CTRL+D oder @@d


/

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 Operanden 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.


$ bc

scale=8

a=16

b=4

scale(a/b)

8

a/b

4.00000000

CTRL+D oder @@d


^

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 beiden 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 Potenzierens ist also 4:


$ bc

scale=7

a=3.1

e=4

scale(a^e)

4

a^e

92.3512

CTRL+D oder @@d


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

CTRL+D oder @@d


==@

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) bzw. R = scale(a@b)

Beispiel 1

a wird eine Zahl mit einer Nachkommastelle, b eine mit zwei Nachkommastellen zugewiesen: scale(a) ist 1 und scale(b) ist 2. Fragen 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

CTRL+D oder @@d


Beispiel 2

a wird eine Zahl mit zwei und b eine Zahl mit drei Nachkommastellen zugewiesen. Beim Funktionsaufruf wird a der Wert der Addition der beiden Operatoren zugewiesen. Für bc ist die Anzahl Nachkommastellen eines Additionsergebnisses gleich der Anzahl Stellen desjenigen Operanden, der die meisten Stellen hat. a hat nach der Zuweisung ebensoviele Stellen, also drei:


$ bc

a=0.12

a=0.123

scale(a)

2

scale(b)

3

a=+b

scale(a)

3

a

.243

CTRL+D oder @@d

$


%

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, dass die Multiplikation exakt ausgeführt wird. Der %-Operator kann hier also als Maß für die Genauigkeit verwendet werden, mit der die Division durchgeführt wird.

R schließlich ist der höchste Wert aus A und dem Additionsergebnis 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

CTRL+D oder @@d


Datei

/usr/lib/lib.b

Mathematische Bibliothek

Internationale Umgebung

Die folgenden Umgebungsvariablen beeinflussen die Ausführung des Kommandos bc:

LANG

Gibt einen Standardwert für die Variablen für die internationale Umgebung an, die nicht gesetzt oder Null sind. Ist LANG nicht gesetzt oder Null, wird der entsprechende Standardwert der internationalen Umgebung verwendet. Enthält eine der Internationalisierungsvariablen eine ungültige Einstellung, verhält sich das Kommando so, als sei keine der Variablen definiert worden.

LC_ALL

Ist diese Variable auf einen Wert gesetzt, d. h. ist sie nicht leer, überschreibt dieser Wert die Werte aller übrigen Internationalisierungsvariablen.

LC_CTYPE

Legt die internationale Umgebung für die Interpretation der Byte-Folgen eines Datentexts als Zeichen fest (z.B. Singlebytezeichen im Unterschied zu Mehrbytezeichen in Argumenten und Eingabedatein).

LC_MESSAGES

Legt die internationale Umgebung für Format und Inhalt der Diagnosemeldungen fest, die in die Standardfehlerausgabe geschrieben werden.

NLSPATH

Legt den Pfad der Meldungsdateien für LC_MESSAGES fest.


Beispiel 1

Zahlen addieren, subtrahieren, multiplizieren, dividieren. Nicht ganzzahlige 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 Exponentialfunktion 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
        }
  }

Das Abbruchkriterium der for-Schleife ist im Schleifenrumpf enthalten (if(c==0)) und wird nicht, wie sonst üblich, durch den zweiten Ausdruck der for-Anweisung gegeben. In einem C-Programm würde man den zweiten Ausdruck der for-Anweisung in einem solchen Fall einfach weglassen. Die for-Anweisung in einem bc-Programm muss 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

Siehe auch

expr, let