BC(1)                                                       BC(1)

     NAME
          bc - arbitrary-precision arithmetic language

     SYNOPSIS
          bc [ -c ] [ -l ] [ file ... ]

     DESCRIPTION
          Bc is an interactive processor for a language that resembles
          C but provides arithmetic on numbers of arbitrary length
          with up to 100 digits right of the decimal point.  It takes
          input from any files given, then reads the standard input.
          The -l argument stands for the name of an arbitrary preci-
          sion math library.  The following syntax for bc programs is
          like that of C; L means letter a-z, E means expression, S
          means statement.

          Lexical
                     comments are enclosed in /* */
                     newlines end statements
          Names
                     simple variables: L
                     array elements: L[E]
                     The words ibase, obase, and scale
          Other operands
                     arbitrarily long numbers with optional sign and
                     decimal point.
                     (E)
                     sqrt(E)
                     length(E)
                          number of significant decimal digits
                     scale(E)
                          number of digits right of decimal point
                     L(E,...,E)
                          function call
          Operators
                     +  -  *  /  %  ^  (% is remainder; ^ is power)
                     ++  --
                     ==  <=  >=  !=  <  >
                     =  +=  -=  *=  /=  %=  ^=
          Statements
                     E
                     { S ; ...  ; S }
                     print E
                     if ( E ) S
                     while ( E ) S
                     for ( E ; E ; E ) S
                     null statement
                     break
                     quit
                     "text"

     Page 1                       Plan 9            (printed 12/21/24)

     BC(1)                                                       BC(1)

          Function definitions
                     define L ( L , ...  , L ){
                     auto L , ...  , L
                     S ; ...  ; S
                     return E
                     }
          Functions in
                     -l math library
                     s(x) sine
                     c(x) cosine
                     e(x) exponential
                     l(x) log
                     a(x) arctangent
                     j(n, x)
                          Bessel function
          All function arguments are passed by value.

          The value of an expression at the top level is printed
          unless the main operator is an assignment.  Text in quotes,
          which may include newlines, is also printed.  Either semi-
          colons or newlines may separate statements.  Assignment to
          scale influences the number of digits to be retained on
          arithmetic operations in the manner of dc(1). Assignments to
          ibase or obase set the input and output number radix respec-
          tively.

          The same letter may be used as an array, a function, and a
          simple variable simultaneously.  All variables are global to
          the program.  Automatic variables are pushed down during
          function calls.  In a declaration of an array as a function
          argument or automatic variable empty square brackets must
          follow the array name.

          Bc is actually a preprocessor for dc(1), which it invokes
          automatically, unless the -c (compile only) option is pre-
          sent.  In this case the dc input is sent to the standard
          output instead.

     EXAMPLES
          Define a function to compute an approximate value of the
          exponential.  Use it to print 10 values.  (The exponential
          function in the library gives better answers.)

          scale = 20
          define e(x) {
               auto a, b, c, i, s
               a = 1
               b = 1
               s = 1
               for(i=1; 1; i++) {
                    a *= x
                    b *= i

     Page 2                       Plan 9            (printed 12/21/24)

     BC(1)                                                       BC(1)

                    c = a/b
                    if(c == 0) return s
                    s += c
               }
          }
          for(i=1; i<=10; i++) print e(i)

     FILES
          /sys/lib/bclib mathematical library

     SEE ALSO
          dc(1), hoc(1)

     BUGS
          No `&&', `||', or `!'  operators.
          A `for' statement must have all three `E's.
          A `quit' is interpreted when read, not when executed.

     Page 3                       Plan 9            (printed 12/21/24)