Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ bc(1) — Reliant UNIX 5.44c4

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

dc(1)

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

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026