BC.1
上传用户:jnzhq888
上传日期:2007-01-18
资源大小:51694k
文件大小:37k
源码类别:

操作系统开发

开发平台:

WINDOWS

  1. bc(1)                     Minix Programmer's Manual                      bc(1)
  2. NAME
  3.      bc - An arbitrary precision calculator language
  4. SYNTAX
  5.      bc [ -lws ] [  file ... ]
  6. VERSION
  7.      This man page documents GNU bc version 1.02.
  8. DESCRIPTION
  9.      bc  is  a  language  that  supports  arbitrary  precision  numbers   with
  10.      interactive  execution of statements.  There are some similarities in the
  11.      syntax to  the  C  programming  language.  A  standard  math  library  is
  12.      available  by  command  line  option.   If requested, the math library is
  13.      defined before processing any files.  bc starts by processing  code  from
  14.      all  the files listed on the command line in the order listed.  After all
  15.      files have been processed, bc reads from the standard input.  All code is
  16.      executed  as  it  is  read.   (If  a  file contains a command to halt the
  17.      processor, bc will never read from the standard input.)
  18.      This version of bc contains  several  extensions  beyond  traditional  bc
  19.      implementations  and  the POSIX draft standard.  Command line options can
  20.      cause these extensions to print  a  warning  or  to  be  rejected.   This
  21.      document  describes  the language accepted by this processor.  Extensions
  22.      will be identified as such.
  23.   OPTIONS
  24.      -l   Define the standard math library.
  25.      -w   Give warnings for extensions to POSIX bc.
  26.      -s   Process exactly the POSIX bc language.
  27.   NUMBERS
  28.      The most basic element in  bc  is  the  number.   Numbers  are  arbitrary
  29.      precision  numbers.   This  precision is both in the integer part and the
  30.      fractional part.  All numbers are represented internally in  decimal  and
  31.      all computation is done in decimal.  (This version truncates results from
  32.      divide and multiply operations.)  There are two  attributes  of  numbers,
  33.      the  length and the scale.  The length is the total number of significant
  34.      decimal digits in a number and the scale is the total number  of  decimal
  35.      digits after the decimal point.  For example:
  36.            .000001 has a length of 6 and scale of 6.
  37.            1935.000 has a length of 7 and a scale of 3.
  38.                                      .                                      1
  39. bc(1)                     Minix Programmer's Manual                      bc(1)
  40.   VARIABLES
  41.      Numbers are stored in  two  types  of  variables,  simple  variables  and
  42.      arrays.   Both  simple  variables  and  array variables are named.  Names
  43.      begin with a letter  followed  by  any  number  of  letters,  digits  and
  44.      underscores.   All letters must be lower case.  (Full alpha-numeric names
  45.      are an extension. In POSIX bc all names are a single lower case  letter.)
  46.      The  type  of variable is clear by the context because all array variable
  47.      names will be followed by brackets ([]).
  48.      There are four special variables, scale, ibase, obase, and  last.   scale
  49.      defines  how  some  operations  use  digits after the decimal point.  The
  50.      default value of scale is 0. ibase and obase define the  conversion  base
  51.      for  input  and output numbers.  The default for both input and output is
  52.      base 10.  last (an extension) is a variable that has  the  value  of  the
  53.      last  printed  number.   These  will be discussed in further detail where
  54.      appropriate.  All of these variables may have values assigned to them  as
  55.      well as used in expressions.
  56.   COMMENTS
  57.      Comments in bc start with the characters /* and end with  the  characters
  58.      */.   Comments  may  start  anywhere  and appear as a single space in the
  59.      input.  (This causes comments to delimit other input items.  For example,
  60.      a  comment  can not be found in the middle of a variable name.)  Comments
  61.      include any newlines (end of line) between the start and the end  of  the
  62.      comment.
  63.   EXPRESSIONS
  64.      The numbers are manipulated by expressions  and  statements.   Since  the
  65.      language  was  designed to be interactive, statements and expressions are
  66.      executed as soon as possible.  There is no "main" program.  Instead, code
  67.      is executed as it is encountered.  (Functions, discussed in detail later,
  68.      are defined when encountered.)
  69.      A simple expression is  just  a  constant.  bc  converts  constants  into
  70.      internal  decimal  numbers using the current input base, specified by the
  71.      variable ibase. (There is an exception in functions.)  The  legal  values
  72.      of  ibase  are 2 through 16 (F).  Assigning a value outside this range to
  73.      ibase will result in a value of 2 or 16.  Input numbers may  contain  the
  74.      characters  0-9  and  A-F.  (Note:   They  must  be capitals.  Lower case
  75.      letters are variable names.)  Single digit numbers always have the  value
  76.      of the digit regardless of the value of ibase. (i.e. A = 10.)  For multi-
  77.      digit numbers, bc changes all input digits greater or equal to  ibase  to
  78.      the  value of ibase-1.  This makes the number FFF always be the largest 3
  79.      digit number of the input base.
  80.      Full expressions are similar to many other high level  languages.   Since
  81.      there  is  only  one kind of number, there are no rules for mixing types.
  82.      Instead, there are rules on the scale of expressions.   Every  expression
  83.      has  a  scale.   This  is derived from the scale of original numbers, the
  84.      operation performed and in many cases, the value of the  variable  scale.
  85.                                      .                                      2
  86. bc(1)                     Minix Programmer's Manual                      bc(1)
  87.      Legal  values  of  the  variable  scale  are  0  to  the  maximum  number
  88.      representable by a C integer.
  89.      In the following descriptions of legal expressions, "expr"  refers  to  a
  90.      complete expression and "var" refers to a simple or an array variable.  A
  91.      simple variable is just a
  92.           name
  93.      and an array variable is specified as
  94.           name[expr]
  95.      Unless specifically mentioned the scale of  the  result  is  the  maximum
  96.      scale of the expressions involved.
  97.      - expr
  98.           The result is the negation of the expression.
  99.      ++ var
  100.           The variable is incremented by one and the new value is  the  result
  101.           of the expression.
  102.      -- var
  103.           The variable is decremented by one and the new value is  the  result
  104.           of the expression.
  105.      var ++
  106.            The result of the expression is the value of the variable and  then
  107.           the variable is incremented by one.
  108.      var --
  109.           The result of the expression is the value of the variable  and  then
  110.           the variable is decremented by one.
  111.      expr + expr
  112.           The result of the expression is the sum of the two expressions.
  113.      expr - expr
  114.           The  result  of  the  expression  is  the  difference  of  the   two
  115.           expressions.
  116.      expr * expr
  117.           The result of the expression is the product of the two expressions.
  118.      expr / expr
  119.           The result of the expression is the quotient of the two expressions.
  120.           The scale of the result is the value of the variable scale.
  121.      expr % expr
  122.           The result of the expression is the "remainder" and it  is  computed
  123.           in  the  following  way.   To  compute a%b, first a/b is computed to
  124.           scale digits.  That result is used to compute a-(a/b)*b to the scale
  125.           of  the  maximum of scale+scale(b) and scale(a).  If scale is set to
  126.                                      .                                      3
  127. bc(1)                     Minix Programmer's Manual                      bc(1)
  128.           zero and both  expressions  are  integers  this  expression  is  the
  129.           integer remainder function.
  130.      expr ^ expr
  131.           The result of the expression is the value of the first raised to the
  132.           second.  The  second  expression must be an integer.  (If the second
  133.           expression is not  an  integer,  a  warning  is  generated  and  the
  134.           expression  is truncated to get an integer value.)  The scale of the
  135.           result is scale if the exponent is negative.   If  the  exponent  is
  136.           positive  the scale of the result is the minimum of the scale of the
  137.           first expression times the value of the exponent and the maximum  of
  138.           scale  and  the  scale  of the first expression.  (e.g. scale(a^b) =
  139.           min(scale(a)*b, max( scale, scale(a))).)  It should  be  noted  that
  140.           expr^0 will always return the value of 1.
  141.      ( expr )
  142.           This alters the standard precedence to force the evaluation  of  the
  143.           expression.
  144.      var = expr
  145.           The variable is assigned the value of the expression.
  146.      var <op>= expr
  147.           This is equivalent to "var = var <op> expr" with the exception  that
  148.           the  "var"  part is evaluated only once.  This can make a difference
  149.           if "var" is an array.
  150.       Relational expressions are a special  kind  of  expression  that  always
  151.      evaluate  to  0 or 1, 0 if the relation is false and 1 if the relation is
  152.      true.  These may appear in any legal expression.  (POSIX bc requires that
  153.      relational expressions are used only in if, while, and for statements and
  154.      that only one relational test may  be  done  in  them.)   The  relational
  155.      operators are
  156.      expr1 < expr2
  157.           The result is 1 if expr1 is strictly less than expr2.
  158.      expr1 <= expr2
  159.           The result is 1 if expr1 is less than or equal to expr2.
  160.      expr1 > expr2
  161.           The result is 1 if expr1 is strictly greater than expr2.
  162.      expr1 >= expr2
  163.           The result is 1 if expr1 is greater than or equal to expr2.
  164.      expr1 == expr2
  165.           The result is 1 if expr1 is equal to expr2.
  166.                                      .                                      4
  167. bc(1)                     Minix Programmer's Manual                      bc(1)
  168.      expr1 != expr2
  169.           The result is 1 if expr1 is not equal to expr2.
  170.      Boolean operations are also legal.   (POSIX  bc  does  NOT  have  boolean
  171.      operations).  The result of all boolean operations are 0 and 1 (for false
  172.      and true) as in relational expressions.  The boolean operators are:
  173.      !expr
  174.           The result is 1 if expr is 0.
  175.      expr && expr
  176.           The result is 1 if both expressions are non-zero.
  177.      expr || expr
  178.           The result is 1 if either expression is non-zero.
  179.      The expression precedence is as follows: (lowest to highest)
  180.           || operator, left associative
  181.           && operator, left associative
  182.           ! operator, nonassociative
  183.           Relational operators, left associative
  184.           Assignment operator, right associative
  185.           + and - operators, left associative
  186.           *, / and % operators, left associative
  187.           ^ operator, right associative
  188.           unary - operator, nonassociative
  189.           ++ and -- operators, nonassociative
  190.      This precedence was chosen so that POSIX compliant bc programs  will  run
  191.      correctly.  This  will  cause  the  use  of  the  relational  and logical
  192.      operators to  have  some  unusual  behavior  when  used  with  assignment
  193.      expressions.  Consider the expression:
  194.           a = 3 < 5
  195.      Most C programmers would assume this would assign the result of "3  <  5"
  196.      (the  value  1)  to the variable "a".  What this does in bc is assign the
  197.      value 3 to the variable "a" and then compare 3 to 5.  It is best  to  use
  198.      parenthesis   when  using  relational  and  logical  operators  with  the
  199.      assignment operators.
  200.      There are a few more special expressions that are provided in bc.   These
  201.      have  to do with user defined functions and standard functions.  They all
  202.      appear as "name(parameters)".  See the  section  on  functions  for  user
  203.      defined functions.  The standard functions are:
  204.      length ( expression )
  205.           The value of the length function is the number of significant digits
  206.           in the expression.
  207.                                      .                                      5
  208. bc(1)                     Minix Programmer's Manual                      bc(1)
  209.      read ( )
  210.           The read function  (an  extension)  will  read  a  number  from  the
  211.           standard  input,  regardless of where the function occurs.   Beware,
  212.           this can cause problems with the mixing of data and program  in  the
  213.           standard  input.   The best use for this function is in a previously
  214.           written program that needs input from the  user,  but  never  allows
  215.           program  code  to  be  input  from  the user.  The value of the read
  216.           function is the number  read  from  the  standard  input  using  the
  217.           current value of the variable ibase for the conversion base.
  218.      scale ( expression )
  219.           The value of the scale function is the number of  digits  after  the
  220.           decimal point in the expression.
  221.      sqrt ( expression )
  222.           The value of the sqrt function is the square root of the expression.
  223.           If the expression is negative, a run time error is generated.
  224.   STATEMENTS
  225.      Statements (as in most algebraic languages)  provide  the  sequencing  of
  226.      expression  evaluation.   In  bc  statements  are  executed  "as  soon as
  227.      possible."  Execution happens when a newline in encountered and there  is
  228.      one  or  more  complete  statements.   Due  to  this immediate execution,
  229.      newlines are very important in bc.  In  fact,  both  a  semicolon  and  a
  230.      newline  are  used as statement separators.  An improperly placed newline
  231.      will cause a syntax error.  Because newlines are statement separators, it
  232.      is  possible  to  hide  a  newline by using the backslash character.  The
  233.      sequence "<nl>", where <nl> is the newline appears to bc  as  whitespace
  234.      instead  of  a  newline.   A  statement  list  is  a series of statements
  235.      separated by semicolons and newlines.  The following  is  a  list  of  bc
  236.      statements  and  what  they  do:  (Things  enclosed  in brackets ([]) are
  237.      optional parts of the statement.)
  238.      expression
  239.           This statement does one of two things.   If  the  expression  starts
  240.           with  "<variable>  <assignment>  ...",  it  is  considered  to be an
  241.           assignment statement.   If  the  expression  is  not  an  assignment
  242.           statement,  the  expression  is evaluated and printed to the output.
  243.           After the number is printed, a newline  is  printed.   For  example,
  244.           "a=1"  is  an assignment statement and "(a=1)" is an expression that
  245.           has an embedded  assignment.   All  numbers  that  are  printed  are
  246.           printed  in  the  base  specified  by  the variable obase. The legal
  247.           values for  obase are  2  through  BC_BASE_MAX.   (See  the  section
  248.           LIMITS.)   For  bases  2  through  16,  the  usual method of writing
  249.           numbers is used.  For bases  greater  than  16,  bc  uses  a  multi-
  250.           character  digit  method  of  printing the numbers where each higher
  251.           base digit is printed as a  base  10  number.   The  multi-character
  252.           digits  are  separated by spaces.  Each digit contains the number of
  253.           characters required to represent the base ten  value  of  "obase-1".
  254.           Since  numbers  are  of arbitrary precision, some numbers may not be
  255.                                      .                                      6
  256. bc(1)                     Minix Programmer's Manual                      bc(1)
  257.           printable on a single output line.  These long numbers will be split
  258.           across  lines  using  the  "" as the last character on a line.  The
  259.           maximum number of characters printed per line is  70.   Due  to  the
  260.           interactive  nature of bc printing a number cause the side effect of
  261.           assigning the printed value the  the  special  variable  last.  This
  262.           allows  the user to recover the last value printed without having to
  263.           retype the expression that printed the number.  Assigning to last is
  264.           legal  and  will  overwrite the last printed value with the assigned
  265.           value.  The newly assigned value will remain until the  next  number
  266.           is printed or another value is assigned to last.
  267.      string
  268.           The string is printed to the output.  Strings start  with  a  double
  269.           quote  character  and  contain  all characters until the next double
  270.           quote character.  All characters are take literally,  including  any
  271.           newline.  No newline character is printed after the string.
  272.      print list
  273.           The print  statement  (an  extension)  provides  another  method  of
  274.           output.   The  "list" is a list of strings and expressions separated
  275.           by commas.  Each string or expression is printed in the order of the
  276.           list.  No terminating newline is printed.  Expressions are evaluated
  277.           and their value is printed  and  assigned  the  the  variable  last.
  278.           Strings  in  the  print  statement are printed to the output and may
  279.           contain special  characters.   Special  characters  start  with  the
  280.           backslash  character  ().   The special characters recognized by bc
  281.           are "b" (bell),  "f"  (form  feed),  "n"  (newline),  "r"  (carriage
  282.           return),  "t"  (tab),  and  ""  (backslash).   Any  other character
  283.           following the backslash will be ignored.  This still does not  allow
  284.           the double quote character to be part of any string.
  285.      { statement_list }
  286.           This is the compound statement.  It allows multiple statements to be
  287.           grouped together for execution.
  288.      if ( expression ) then statement1 [else statement2]
  289.           The if statement evaluates the expression and executes statement1 or
  290.           statement2  depending  on  the  value  of  the  expression.   If the
  291.           expression is non-zero, statement1 is executed.   If  statement2  is
  292.           present  and  the  value  of the expression is 0, then statement2 is
  293.           executed.  (The else clause is an extension.)
  294.      while ( expression ) statement
  295.           The while statement will execute the statement while the  expression
  296.           is  non-zero.   It evaluates the expression before each execution of
  297.           the statement.   Termination  of  the  loop  is  caused  by  a  zero
  298.           expression value or the execution of a break statement.
  299.                                      .                                      7
  300. bc(1)                     Minix Programmer's Manual                      bc(1)
  301.      for ( [expression1] ; [expression2] ; [expression3] ) statement
  302.           The for statement controls  repeated  execution  of  the  statement.
  303.           Expression1  is evaluated before the loop.  Expression2 is evaluated
  304.           before each execution of the statement.   If  it  is  non-zero,  the
  305.           statement  is  evaluated.   If  it  is zero, the loop is terminated.
  306.           After each execution of  the  statement,  expression3  is  evaluated
  307.           before   the   reevaluation   of  expression2.   If  expression1  or
  308.           expression3 are missing, nothing is  evaluated  at  the  point  they
  309.           would  be  evaluated.   If expression2 is missing, it is the same as
  310.           substituting the value 1 for expression2.  (The optional expressions
  311.           are  an  extension.  POSIX  bc requires all three expressions.)  The
  312.           following is equivalent code for the for statement:
  313.                expression1;
  314.                while (expression2) {
  315.                   statement;
  316.                   expression3;
  317.                }
  318.      break
  319.           This statement causes a forced exit of  the  most  recent  enclosing
  320.           while statement or for statement.
  321.      continue
  322.           The continue  statement  (an  extension)   causes  the  most  recent
  323.           enclosing for statement to start the next iteration.
  324.      halt The halt statement (an extension)  is  an  executed  statement  that
  325.           causes  the  bc  processor  to  quit  only when it is executed.  For
  326.           example, "if (0 == 1) halt" will not cause bc to  terminate  because
  327.           the halt is not executed.
  328.      return
  329.           Return the value 0 from a function.  (See the section on functions.)
  330.      return ( expression )
  331.           Return the value of  the  expression  from  a  function.   (See  the
  332.           section on functions.)
  333.   PSEUDO STATEMENTS
  334.      These statements are not statements in the traditional sense.   They  are
  335.      not executed statements.  Their function is performed at "compile" time.
  336.      limits
  337.           Print the local limits enforced by the local version of bc.  This is
  338.           an extension.
  339.      quit When the quit statement is read, the  bc  processor  is  terminated,
  340.           regardless  of  where the quit statement is found.  For example, "if
  341.           (0 == 1) quit" will cause bc to terminate.
  342.                                      .                                      8
  343. bc(1)                     Minix Programmer's Manual                      bc(1)
  344.      warranty
  345.           Print a longer warranty notice.  This is an extension.
  346.   FUNCTIONS
  347.      Functions provide a method of defining a computation that can be executed
  348.      later.   Functions  in  bc  always  compute  a value and return it to the
  349.      caller.  Function definitions are "dynamic" in the sense that a  function
  350.      is  undefined  until  a  definition  is  encountered  in the input.  That
  351.      definition is then used until another definition function  for  the  same
  352.      name  is  encountered.   The  new  definition  then  replaces  the  older
  353.      definition.  A function is defined as follows:
  354.           define name ( parameters ) { newline
  355.               auto_list   statement_list }
  356.      A function call is just an expression of the form "name(parameters)".
  357.      Parameters are  numbers  or  arrays  (an  extension).   In  the  function
  358.      definition,  zero  or  more parameters are defined by listing their names
  359.      separated by commas.  Numbers are only call by value parameters.   Arrays
  360.      are  only  call  by  variable.   Arrays  are  specified  in the parameter
  361.      definition by the notation  "name[]".    In  the  function  call,  actual
  362.      parameters are full expressions for number parameters.  The same notation
  363.      is used for passing arrays as for defining array parameters.   The  named
  364.      array  is passed by variable to the function.  Since function definitions
  365.      are dynamic, parameter numbers and types are checked when a  function  is
  366.      called.   Any  mismatch  in  number  or  types of parameters will cause a
  367.      runtime error.  A runtime error will  also  occur  for  the  call  to  an
  368.      undefined function.
  369.      The auto_list is an optional list of variables that are for "local"  use.
  370.      The  syntax  of  the  auto list (if present) is "auto name, ... ;".  (The
  371.      semicolon is optional.)  Each name is  the  name  of  an  auto  variable.
  372.      Arrays may be specified by using the same notation as used in parameters.
  373.      These variables have their values pushed onto a stack at the start of the
  374.      function.  The variables are then initialized to zero and used throughout
  375.      the execution of the function.  At function  exit,  these  variables  are
  376.      popped  so  that the original value (at the time of the function call) of
  377.      these variables are restored.  The parameters are really  auto  variables
  378.      that  are  initialized  to  a  value provided in the function call.  Auto
  379.      variables are different than traditional local variables in the fact that
  380.      if  function A calls function B, B may access function A's auto variables
  381.      by just using the same name, unless  function  B  has  called  them  auto
  382.      variables.  Due to the fact that auto variables and parameters are pushed
  383.      onto a stack, bc supports recursive functions.
  384.      The function body is a list of  bc  statements.   Again,  statements  are
  385.      separated  by  semicolons  or  newlines.   Return  statements  cause  the
  386.      termination of a function and the return  of  a  value.   There  are  two
  387.      versions  of the return statement.  The first form, "return", returns the
  388.      value 0 to the calling expression.  The second form, "return ( expression
  389.      )",  computes  the  value of the expression and returns that value to the
  390.                                      .                                      9
  391. bc(1)                     Minix Programmer's Manual                      bc(1)
  392.      calling expression.  There is an implied "return (0)" at the end of every
  393.      function.   This  allows  a function to terminate and return 0 without an
  394.      explicit return statement.
  395.      Functions also change the usage of the variable ibase.  All constants  in
  396.      the  function body will be converted using the value of ibase at the time
  397.      of the function call.  Changes  of  ibase  will  be  ignored  during  the
  398.      execution  of  the  function except for the standard function read, which
  399.      will always use the current value of ibase for conversion of numbers.
  400.   MATH LIBRARY
  401.      If bc is invoked with the -l option, a math library is preloaded and  the
  402.      default  scale  is  set  to 20.   The math functions will calculate their
  403.      results to the scale set at the time of  their  call.  The  math  library
  404.      defines the following functions:
  405.      s (x)
  406.           The sine of x in radians.
  407.      c (x)
  408.           The cosine of x in radians.
  409.      a (x)
  410.           The arctangent of x.
  411.      l (x)
  412.           The natural logarithm of x.
  413.      e (x)
  414.           The exponential function of raising e to the value x.
  415.      j (n,x)
  416.           The bessel function of integer order n of x.
  417.   EXAMPLES
  418.      In /bin/sh,  the following will assign the value of  "pi"  to  the  shell
  419.      variable pi.
  420.            pi=$(echo "scale=10; 4*a(1)" | bc -l)
  421.      The following is the definition of the exponential function used  in  the
  422.      math library.  This function is written in POSIX bc.
  423.           scale = 20
  424.           /* Uses the fact that e^x = (e^(x/2))^2
  425.              When x is small enough, we use the series:
  426.                e^x = 1 + x + x^2/2! + x^3/3! + ...
  427.           */
  428.           define e(x) {
  429.                                      .                                     10
  430. bc(1)                     Minix Programmer's Manual                      bc(1)
  431.             auto  a, d, e, f, i, m, v, z
  432.             /* Check the sign of x. */
  433.             if (x<0) {
  434.               m = 1
  435.               x = -x
  436.             }
  437.             /* Precondition x. */
  438.             z = scale;
  439.             scale = 4 + z + .44*x;
  440.             while (x > 1) {
  441.               f += 1;
  442.               x /= 2;
  443.             }
  444.             /* Initialize the variables. */
  445.             v = 1+x
  446.             a = x
  447.             d = 1
  448.             for (i=2; 1; i++) {
  449.               e = (a *= x) / (d *= i)
  450.               if (e == 0) {
  451.                 if (f>0) while (f--)  v = v*v;
  452.                 scale = z
  453.                 if (m) return (1/v);
  454.                 return (v/1);
  455.               }
  456.               v += e
  457.             }
  458.           }
  459.      The following is code that uses the extended features of bc to  implement
  460.      a  simple  program  for  calculating checkbook balances.  This program is
  461.      best kept in a file so that it can be used many times without  having  to
  462.      retype it at every use.
  463.           scale=2
  464.           print "nCheck book program!n"
  465.           print "  Remember, deposits are negative transactions.n"
  466.           print "  Exit by a 0 transaction.nn"
  467.           print "Initial balance? "; bal = read()
  468.           bal /= 1
  469.           print "n"
  470.           while (1) {
  471.             "current balance = "; bal
  472.             "transaction? "; trans = read()
  473.                                      .                                     11
  474. bc(1)                     Minix Programmer's Manual                      bc(1)
  475.             if (trans == 0) break;
  476.             bal -= trans
  477.             bal /= 1
  478.           }
  479.           quit
  480.      The following is the definition of the recursive factorial function.
  481.           define f (x) {
  482.             if (x <= 1) return (1);
  483.             return (f(x-1) * x);
  484.           }
  485.   DIFFERENCES
  486.      This version of bc was implemented from the POSIX P1003.2/D11  draft  and
  487.      contains  several  differences  and  extensions relative to the draft and
  488.      traditional implementations.  It is not implemented  in  the  traditional
  489.      way using dc(1). This version is a single process which parses and runs a
  490.      byte code translation of the program.  There is an "undocumented"  option
  491.      (-c)  that  causes  the  program  to output the byte code to the standard
  492.      output instead of running it.  It  was  mainly  used  for  debugging  the
  493.      parser and preparing the math library.
  494.      A major source of differences is extensions, where a feature is  extended
  495.      to  add  more  functionality and additions, where new features are added.
  496.      The following is the list of differences and extensions.
  497.      LANG       This version does not conform to the  POSIX  standard  in  the
  498.                 processing   of   the   LANG   environment  variable  and  all
  499.                 environment variables starting with LC_.
  500.      names      Traditional  and  POSIX  bc  have  single  letter  names   for
  501.                 functions,  variables  and arrays.  They have been extended to
  502.                 be multi-character names that start  with  a  letter  and  may
  503.                 contain letters, numbers and the underscore character.
  504.      Strings    Strings are not allowed to contain NUL characters.  POSIX says
  505.                 all characters must be included in strings.
  506.      last       POSIX bc does not have a last variable.  Some  implementations
  507.                 of bc use the period (.) in a similar way.
  508.      comparisons
  509.                 POSIX bc allows comparisons only  in  the  if  statement,  the
  510.                 while   statement,  and  the  second  expression  of  the  for
  511.                 statement.  Also, only one relational operation is allowed  in
  512.                 each of those statements.
  513.                                      .                                     12
  514. bc(1)                     Minix Programmer's Manual                      bc(1)
  515.      if statement, else clause
  516.                 POSIX bc does not have an else clause.
  517.      for statement
  518.                 POSIX bc requires all expressions to be  present  in  the  for
  519.                 statement.
  520.      &&, ||, !  POSIX bc does not have the logical operators.
  521.      read function
  522.                 POSIX bc does not have a read function.
  523.      print statement
  524.                 POSIX bc does not have a print statement .
  525.      continue statement
  526.                 POSIX bc does not have a continue statement.
  527.      array parameters
  528.                 POSIX   bc   does   not   have   array   parameters.     Other
  529.                 implementations of bc may have call by value array parameters.
  530.      =+, =-, =*, =/, =%, =^
  531.                 POSIX  bc  does  not  require  these  "old  style"  assignment
  532.                 operators  to  be  defined.  This version may allow these "old
  533.                 style" assignments.  Use the limits statement to  see  if  the
  534.                 installed  version supports them.  If it does support the "old
  535.                 style" assignment operators,  the  statement  "a  =-  1"  will
  536.                 decrement a by 1 instead of setting a to the value -1.
  537.      spaces in numbers
  538.                 Other implementations of bc  allow  spaces  in  numbers.   For
  539.                 example,  "x=1 3" would assign the value 13 to the variable x.
  540.                 The same statement would cause a syntax error in this  version
  541.                 of bc.
  542.      errors and execution
  543.                 This implementation varies from other implementations in terms
  544.                 of what code will be executed when syntax and other errors are
  545.                 found in the program.   If  a  syntax  error  is  found  in  a
  546.                 function   definition,   error  recovery  tries  to  find  the
  547.                 beginning of a statement and continue to parse  the  function.
  548.                 Once  a  syntax  error  is found in the function, the function
  549.                 will not be callable and becomes undefined.  Syntax errors  in
  550.                 the  interactive  execution  code  will invalidate the current
  551.                 execution block.  The execution block is terminated by an  end
  552.                 of  line that appears after a complete sequence of statements.
  553.                 For example,
  554.                      a = 1
  555.                      b = 2
  556.                                      .                                     13
  557. bc(1)                     Minix Programmer's Manual                      bc(1)
  558.                 has two execution blocks and
  559.                      { a = 1
  560.                        b = 2 }
  561.                 has one execution block.  Any runtime error will terminate the
  562.                 execution  of  the current execution block.  A runtime warning
  563.                 will not terminate the current execution block.
  564.      Interrupts During an interactive  session,  the  SIGINT  signal  (usually
  565.                 generated  by  the control-C character from the terminal) will
  566.                 cause  execution  of  the  current  execution  block   to   be
  567.                 interrupted.   It  will  display  a "runtime" error indicating
  568.                 which function was interrupted.  After all runtime  structures
  569.                 have  been cleaned up, a message will be printed to notify the
  570.                 user that bc is ready for more input.  All previously  defined
  571.                 functions  remain  defined  and  the  value  of  all  non-auto
  572.                 variables are the value at the  point  of  interruption.   All
  573.                 auto  variables and function parameters are removed during the
  574.                 clean up  process.   During  a  non-interactive  session,  the
  575.                 SIGINT signal will terminate the entire run of bc.
  576.   LIMITS
  577.      The following are the limits currently in place for  this  bc  processor.
  578.      Some  of  them  may have been changed by an installation.  Use the limits
  579.      statement to see the actual values.
  580.      BC_BASE_MAX
  581.                 The maximum output base is currently set at 999.  The  maximum
  582.                 input base is 16.
  583.      BC_DIM_MAX This is currently an arbitrary limit of 65535 as  distributed.
  584.                 Your installation may be different.
  585.      BC_SCALE_MAX
  586.                 The number of digits after the decimal  point  is  limited  to
  587.                 INT_MAX digits.  Also, the number of digits before the decimal
  588.                 point is limited to INT_MAX digits.
  589.      BC_STRING_MAX
  590.                 The limit on the number of characters in a string  is  INT_MAX
  591.                 characters.
  592.      exponent   The value of the  exponent  in  the  raise  operation  (^)  is
  593.                 limited to LONG_MAX.
  594.      multiply   The multiply routine may yield incorrect results if  a  number
  595.                 has  more  than LONG_MAX / 90 total digits.  For 32 bit longs,
  596.                 this number is 23,860,929 digits.
  597.                                      .                                     14
  598. bc(1)                     Minix Programmer's Manual                      bc(1)
  599.      code size  Each function and the "main"  program  are  limited  to  10240
  600.                 bytes  of  compiled  byte code each.  This limit (BC_MAX_SEGS)
  601.                 can be easily changed to have more than 10  segments  of  1024
  602.                 bytes.
  603.      variable names
  604.                 The current limit on the number of unique names is  32767  for
  605.                 each of simple variables, arrays and functions.
  606. FILES
  607.      In most installations, bc is completely self-contained.  Where executable
  608.      size  is  of  importance  or  the C compiler does not deal with very long
  609.      strings,  bc  will  read  the  standard  math  library  from   the   file
  610.      /usr/local/lib/libmath.b.   (The  actual  location  may  vary.  It may be
  611.      /lib/libmath.b.)
  612. DIAGNOSTICS
  613.      If any file on the command line can not be opened, bc  will  report  that
  614.      the  file  is unavailable and terminate.  Also, there are compile and run
  615.      time diagnostics that should be self-explanatory.
  616. BUGS
  617.      Error recovery is not very good yet.
  618. AUTHOR
  619.      Philip A. Nelson
  620.      phil@cs.wwu.edu
  621. ACKNOWLEDGEMENTS
  622.      The author would like to thank Steve Sommars (sesv@iwtsf.att.com) for his
  623.      extensive  help  in  testing  the implementation.  Many great suggestions
  624.      were given.  This is a much better product due to his involvement.
  625.                                      .                                     15