BC(1)                                                       BC(1)

     NAME
          bc - arbitrary-precision arithmetic language

     SYNOPSIS
          bc [ -c ] [ -l ] [ -s ] [ 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 -s argument suppresses the automatic
          display of calculation results; all output is via the print
          command.

          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

     Page 1                       Plan 9             (printed 3/28/24)

     BC(1)                                                       BC(1)

                     break
                     quit
                     "text"
          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 or the -s command
          line argument is given.  Text in quotes, which may include
          newlines, is always printed.  Either semicolons 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 respectively.

          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.

     EXAMPLE
          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

     Page 2                       Plan 9             (printed 3/28/24)

     BC(1)                                                       BC(1)

               for(i=1; 1; i++) {
                    a *= x
                    b *= i
                    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

     SOURCE
          /sys/src/cmd/bc.y

     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 3/28/24)