Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
BC(1)			    General Commands Manual			 BC(1)

NAME
       bc - arbitrary-precision	decimal	arithmetic language and	calculator

SYNOPSIS
       bc [-cCghilPqRsvVw] [--digit-clamp] [--no-digit-clamp]
       [--global-stacks] [--help] [--interactive] [--mathlib] [--no-prompt]
       [--no-read-prompt] [--quiet] [--standard] [--warn] [--version] [-e
       expr] [--expression=expr...]  [-f file...]  [--file=file...]  [file...]
       [-I ibase] [--ibase=ibase] [-O obase] [--obase=obase] [-S scale]
       [--scale=scale] [-E seed] [--seed=seed]

DESCRIPTION
       bc(1) is	an interactive processor for a language	first standardized in
       1991 by POSIX.  (See the	STANDARDS section.)  The language provides
       unlimited precision decimal arithmetic and is somewhat C-like, but
       there are differences.  Such differences	will be	noted in this
       document.

       After parsing and handling options, this	bc(1) reads any	files given on
       the command line	and executes them before reading from stdin.

       This bc(1) is a drop-in replacement for any bc(1), including (and
       especially) the GNU bc(1).  It also has many extensions and extra
       features	beyond other implementations.

       Note: If	running	this bc(1) on any script meant for another bc(1) gives
       a parse error, it is probably because a word this bc(1) reserves	as a
       keyword is used as the name of a	function, variable, or array.  To fix
       that, use the command-line option -r keyword, where keyword is the
       keyword that is used as a name in the script.  For more information,
       see the OPTIONS section.

       If parsing scripts meant	for other bc(1)	implementations	still does not
       work, that is a bug and should be reported.  See	the BUGS section.

OPTIONS
       The following are the options that bc(1)	accepts.

       -C, --no-digit-clamp
	      Disables clamping	of digits greater than or equal	to the current
	      ibase when parsing numbers.

	      This  means  that	 the  value  added to a	number from a digit is
	      always that digit's value	 multiplied  by	 the  value  of	 ibase
	      raised to	the power of the digit's position, which starts	from 0
	      at the least significant digit.

	      If  this	and/or	the  -c	 or  --digit-clamp  options  are given
	      multiple times, the last one given is used.

	      This option overrides the	 BC_DIGIT_CLAMP	 environment  variable
	      (see  the	 ENVIRONMENT VARIABLES section)	and the	default, which
	      can be queried with the -h or --help options.

	      This is a	non-portable extension.

       -c, --digit-clamp
	      Enables clamping of digits greater than or equal to the  current
	      ibase when parsing numbers.

	      This  means  that	digits that the	value added to a number	from a
	      digit that is greater than or equal to the ibase is the value of
	      ibase minus 1 all	multiplied by the value	of ibase raised	to the
	      power of the digit's position, which starts from 0 at the	 least
	      significant digit.

	      If  this	and/or	the  -C	 or --no-digit-clamp options are given
	      multiple times, the last one given is used.

	      This option overrides the	 BC_DIGIT_CLAMP	 environment  variable
	      (see  the	 ENVIRONMENT VARIABLES section)	and the	default, which
	      can be queried with the -h or --help options.

	      This is a	non-portable extension.

       -E seed,	--seed=seed
	      Sets the builtin variable	seed to	the value seed	assuming  that
	      seed  is in base 10.  It is a fatal error	if seed	is not a valid
	      number.

	      If multiple instances of this option  are	 given,	 the  last  is
	      used.

	      This is a	non-portable extension.

       -e expr,	--expression=expr
	      Evaluates	 expr.	 If  multiple  expressions are given, they are
	      evaluated	in order.  If files are	given as well (see the -f  and
	      --file  options),	the expressions	and files are evaluated	in the
	      order given.  This means that if	a  file	 is  given  before  an
	      expression, the file is read in and evaluated first.

	      If  this	option	is  given  on  the  command-line (i.e.,	not in
	      BC_ENV_ARGS, see the ENVIRONMENT VARIABLES section), then	 after
	      processing  all expressions and files, bc(1) will	exit, unless -
	      (stdin) was given	as an argument at least	once to	-f or  --file,
	      whether  on the command-line or in BC_ENV_ARGS.  However,	if any
	      other -e,	--expression, -f, or --file arguments are given	 after
	      -f-  or  equivalent  is given, bc(1) will	give a fatal error and
	      exit.

	      This is a	non-portable extension.

       -f file,	--file=file
	      Reads in file and	evaluates it, line by line, as though it  were
	      read  through  stdin.  If	expressions are	also given (see	the -e
	      and --expression options), the expressions are evaluated in  the
	      order given.

	      If  this	option	is  given  on  the  command-line (i.e.,	not in
	      BC_ENV_ARGS, see the ENVIRONMENT VARIABLES section), then	 after
	      processing  all expressions and files, bc(1) will	exit, unless -
	      (stdin) was given	as an argument at least	once to	-f or  --file.
	      However,	if any other -e, --expression, -f, or --file arguments
	      are given	after -f- or equivalent	is given, bc(1)	 will  give  a
	      fatal error and exit.

	      This is a	non-portable extension.

       -g, --global-stacks
	      Turns the	globals	ibase, obase, scale, and seed into stacks.

	      This has the effect that a copy of the current value of all four
	      are  pushed  onto	 a  stack  for every function call, as well as
	      popped when every	function returns.  This	means  that  functions
	      can assign to any	and all	of those globals without worrying that
	      the  change  will	 affect	other functions.  Thus,	a hypothetical
	      function named output(x,b) that simply printed x in base b could
	      be written like this:

		     define void output(x, b) {
			 obase=b
			 x
		     }

	      instead of like this:

		     define void output(x, b) {
			 auto c
			 c=obase
			 obase=b
			 x
			 obase=c
		     }

	      This makes writing functions much	easier.

	      (Note: the function output(x,b)  exists  in  the	extended  math
	      library.	See the	LIBRARY	section.)

	      However,	since  using this flag means that functions cannot set
	      ibase, obase, scale, or seed globally, functions that  are  made
	      to  do so	cannot work anymore.  There are	two possible use cases
	      for that,	and each has a solution.

	      First, if	a function is called on	startup	to turn	bc(1)  into  a
	      number converter,	it is possible to replace that capability with
	      various shell aliases.  Examples:

		     alias d2o="bc -e ibase=A -e obase=8"
		     alias h2b="bc -e ibase=G -e obase=2"

	      Second,  if  the	purpose	 of a function is to set ibase,	obase,
	      scale, or	seed globally for any other purpose, it	could be split
	      into one to four functions (based	on how many globals  it	 sets)
	      and each of those	functions could	return the desired value for a
	      global.

	      For  functions  that set seed, the value assigned	to seed	is not
	      propagated to parent functions.  This means that the sequence of
	      pseudo-random numbers  that  they	 see  will  not	 be  the  same
	      sequence of pseudo-random	numbers	that any parent	sees.  This is
	      only the case once seed has been set.

	      If   a   function	  desires   to	not  affect  the  sequence  of
	      pseudo-random numbers of its parents, but	wants to use the  same
	      seed, it can use the following line:

		     seed = seed

	      If  the  behavior	 of  this  option  is desired for every	run of
	      bc(1), then users	could make  sure  to  define  BC_ENV_ARGS  and
	      include  this  option (see the ENVIRONMENT VARIABLES section for
	      more details).

	      If -s, -w, or any	equivalents are	used, this option is ignored.

	      This is a	non-portable extension.

       -h, --help
	      Prints a usage message and exits.

       -I ibase, --ibase=ibase
	      Sets the builtin variable	ibase to the value ibase assuming that
	      ibase is in base 10.  It is a fatal error	 if  ibase  is	not  a
	      valid number.

	      If  multiple  instances  of  this	 option	are given, the last is
	      used.

	      This is a	non-portable extension.

       -i, --interactive
	      Forces interactive mode.	(See the INTERACTIVE MODE section.)

	      This is a	non-portable extension.

       -L, --no-line-length
	      Disables	line  length  checking	and  prints  numbers   without
	      backslashes  and	newlines.   In	other  words, this option sets
	      BC_LINE_LENGTH to	0 (see the ENVIRONMENT VARIABLES section).

	      This is a	non-portable extension.

       -l, --mathlib
	      Sets scale (see the SYNTAX section) to 20	and loads the included
	      math library and the extended math library  before  running  any
	      code,  including	any  expressions  or  files  specified	on the
	      command line.

	      To learn what is in the libraries, see the LIBRARY section.

       -O obase, --obase=obase
	      Sets the builtin variable	obase to the value obase assuming that
	      obase is in base 10.  It is a fatal error	 if  obase  is	not  a
	      valid number.

	      If  multiple  instances  of  this	 option	are given, the last is
	      used.

	      This is a	non-portable extension.

       -P, --no-prompt
	      Disables the prompt in TTY mode.	(The prompt is only enabled in
	      TTY mode.	 See the TTY MODE section.)  This is mostly for	 those
	      users  that  do not want a prompt	or are not used	to having them
	      in bc(1).	 Most of those users would want	to put this option  in
	      BC_ENV_ARGS (see the ENVIRONMENT VARIABLES section).

	      These options override the BC_PROMPT and BC_TTY_MODE environment
	      variables	(see the ENVIRONMENT VARIABLES section).

	      This is a	non-portable extension.

       -q, --quiet
	      This   option   is   for	 compatibility	 with  the  GNU	 bc(1)
	      (https://www.gnu.org/software/bc/); it is	a no-op.  Without this
	      option, GNU bc(1)	prints a copyright header.   This  bc(1)  only
	      prints  the  copyright  header  if one or	more of	the -v,	-V, or
	      --version	options	are given  unless  the	BC_BANNER  environment
	      variable is set and contains a non-zero integer or if this bc(1)
	      was  built with the header displayed by default.	If any of that
	      is the case, then	this option does prevent bc(1)	from  printing
	      the header.

	      This is a	non-portable extension.

       -R, --no-read-prompt
	      Disables	the read prompt	in TTY mode.  (The read	prompt is only
	      enabled in TTY mode.  See	the TTY	MODE section.)	This is	mostly
	      for those	users that do not want a read prompt or	are  not  used
	      to  having them in bc(1).	 Most of those users would want	to put
	      this  option  in	BC_ENV_ARGS  (see  the	ENVIRONMENT  VARIABLES
	      section).	  This	option	is  also  useful in hash bang lines of
	      bc(1) scripts that prompt	for user input.

	      This option does not disable the regular prompt because the read
	      prompt is	only used when the read() built-in function is called.

	      These  options  do  override  the	 BC_PROMPT   and   BC_TTY_MODE
	      environment  variables  (see the ENVIRONMENT VARIABLES section),
	      but only for the read prompt.

	      This is a	non-portable extension.

       -r keyword, --redefine=keyword
	      Redefines	keyword	in order to allow it to	be used	as a function,
	      variable,	or array name.	This is	useful when this  bc(1)	 gives
	      parse   errors  when  parsing  scripts  meant  for  other	 bc(1)
	      implementations.

	      The keywords this	bc(1) allows to	be redefined are:

	      	abs

	      	asciify

	      	continue

	      	divmod

	      	else

	      	halt

	      	irand

	      	last

	      	limits

	      	maxibase

	      	maxobase

	      	maxrand

	      	maxscale

	      	modexp

	      	print

	      	rand

	      	read

	      	seed

	      	stream

	      If any of	those keywords are used	as a  function,	 variable,  or
	      array  name in a script, use this	option with the	keyword	as the
	      argument.	 If multiple are used, use  this  option  for  all  of
	      them; it can be used multiple times.

	      Keywords are not redefined when parsing the builtin math library
	      (see the LIBRARY section).

	      It  is  a	fatal error to redefine	keywords mandated by the POSIX
	      standard (see the	STANDARDS section).  It	is a  fatal  error  to
	      attempt  to  redefine  words that	this bc(1) does	not reserve as
	      keywords.

       -S scale, --scale=scale
	      Sets the builtin variable	scale to the value scale assuming that
	      scale is in base 10.  It is a fatal error	 if  scale  is	not  a
	      valid number.

	      If  multiple  instances  of  this	 option	are given, the last is
	      used.

	      This is a	non-portable extension.

       -s, --standard
	      Process exactly the language defined by the  standard  (see  the
	      STANDARDS	section) and error if any extensions are used.

	      This is a	non-portable extension.

       -v, -V, --version
	      Print the	version	information (copyright header) and exits.

	      This is a	non-portable extension.

       -w, --warn
	      Like  -s	and  --standard, except	that warnings (and not errors)
	      are printed for non-standard extensions and execution  continues
	      normally.

	      This is a	non-portable extension.

       -z, --leading-zeroes
	      Makes  bc(1)  print all numbers greater than -1 and less than 1,
	      and not equal to 0, with a leading zero.

	      This  can	 be  set  for  individual  numbers  with  the  plz(x),
	      plznl(x),	 pnlz(x), and pnlznl(x)	functions in the extended math
	      library (see the LIBRARY section).

	      This is a	non-portable extension.

       All long	options	are non-portable extensions.

STDIN
       If no files or  expressions  are	 given	by  the	 -f,  --file,  -e,  or
       --expression options, then bc(1)	reads from stdin.

       However,	there are a few	caveats	to this.

       First, stdin is evaluated a line	at a time.  The	only exception to this
       is  if  the  parse  cannot complete.  That means	that starting a	string
       without ending it or starting a function, if statement, or loop without
       ending it will also cause bc(1) to not execute.

       Second, after an	if statement, bc(1) doesn't know if an else  statement
       will follow, so it will not execute until it knows there	will not be an
       else statement.

STDOUT
       Any  non-error  output  is  written to stdout.  In addition, if history
       (see the	HISTORY	section) and the prompt	(see the TTY MODE section) are
       enabled,	both are output	to stdout.

       Note: Unlike other bc(1)	implementations, this bc(1) will issue a fatal
       error (see the EXIT STATUS section) if it cannot	write to stdout, so if
       stdout is closed, as in bc  >&-,	it will	quit with an error.   This  is
       done  so	 that bc(1) can	report problems	when stdout is redirected to a
       file.

       If there	are scripts  that  depend  on  the  behavior  of  other	 bc(1)
       implementations,	 it  is	 recommended  that those scripts be changed to
       redirect	stdout to /dev/null.

STDERR
       Any error output	is written to stderr.

       Note: Unlike other bc(1)	implementations, this bc(1) will issue a fatal
       error (see the EXIT STATUS section) if it cannot	write to stderr, so if
       stderr is closed, as in bc  2>&-, it will quit with an error.  This  is
       done  so	 that  bc(1)  can  exit	 with  an  error  code	when stderr is
       redirected to a file.

       If there	are scripts  that  depend  on  the  behavior  of  other	 bc(1)
       implementations,	 it  is	 recommended  that those scripts be changed to
       redirect	stderr to /dev/null.

SYNTAX
       The syntax for bc(1) programs is	mostly C-like, with some  differences.
       This  bc(1)  follows  the  POSIX	 standard (see the STANDARDS section),
       which is	a much more thorough resource  for  the	 language  this	 bc(1)
       accepts.	  This	section	 is meant to be	a summary and a	listing	of all
       the extensions to the standard.

       In the sections below, E	means expression, S  means  statement,	and  I
       means identifier.

       Identifiers  (I)	 start	with a lowercase letter	and can	be followed by
       any number (up to BC_NAME_MAX-1)	of  lowercase  letters	(a-z),	digits
       (0-9), and underscores (_).  The	regex is [a-z][a-z0-9_]*.  Identifiers
       with more than one character (letter) are a non-portable	extension.

       ibase  is  a  global  variable  determining  how	 to interpret constant
       numbers.	 It  is	 the  "input"  base,  or  the  number  base  used  for
       interpreting  input  numbers.   ibase  is  initially  10.   If  the  -s
       (--standard) and	-w (--warn) flags were not given on the	command	 line,
       the max allowable value for ibase is 36.	 Otherwise, it is 16.  The min
       allowable  value	for ibase is 2.	 The max allowable value for ibase can
       be queried in bc(1) programs with the maxibase()	built-in function.

       obase is	a global variable determining how to output  results.	It  is
       the  "output"  base,  or	 the  number base used for outputting numbers.
       obase  is  initially  10.   The	max  allowable	value  for  obase   is
       BC_BASE_MAX  and	 can  be queried in bc(1) programs with	the maxobase()
       built-in	function.  The min allowable value for obase is	0.   If	 obase
       is  0,  values  are  output  in scientific notation, and	if obase is 1,
       values are output  in  engineering  notation.   Otherwise,  values  are
       output in the specified base.

       Outputting  in  scientific  and	engineering notations are non-portable
       extensions.

       The scale of an expression is the number	of digits in the result	of the
       expression right	of the decimal point, and scale	is a  global  variable
       that  sets  the precision of any	operations, with exceptions.  scale is
       initially 0.  scale cannot be negative.	The max	 allowable  value  for
       scale  is  BC_SCALE_MAX	and  can be queried in bc(1) programs with the
       maxscale() built-in function.

       bc(1) has  both	global	variables  and	local  variables.   All	 local
       variables  are  local  to  the  function;  they	are  parameters	or are
       introduced in the auto list of a	function (see the FUNCTIONS  section).
       If a variable is	accessed which is not a	parameter or in	the auto list,
       it  is assumed to be global.  If	a parent function has a	local variable
       version of a variable that a child function considers global, the value
       of that global variable in the child  function  is  the	value  of  the
       variable	 in  the  parent  function, not	the value of the actual	global
       variable.

       All of the above	applies	to arrays as well.

       The value of a statement	that is	an expression (i.e., any of the	 named
       expressions  or	operands)  is  printed	unless	the  lowest precedence
       operator	is an assignment operator and the expression is	 notsurrounded
       by parentheses.

       The  value  that	 is  printed  is also assigned to the special variable
       last.  A	single dot (.) may also	be used	as a synonym for last.	 These
       are non-portable	extensions.

       Either semicolons or newlines may separate statements.

   Comments
       There are two kinds of comments:

       1. Block	comments are enclosed in /* and	*/.

       2. Line	comments go from # until, and not including, the next newline.
	  This is a non-portable extension.

   Named Expressions
       The following are named expressions in bc(1):

       1. Variables: I

       2. Array	Elements: I[E]

       3. ibase

       4. obase

       5. scale

       6. seed

       7. last or a single dot (.)

       Numbers 6 and 7 are non-portable	extensions.

       The meaning of seed is dependent	on the	current	 pseudo-random	number
       generator  but  is  guaranteed  to  not	change	except	for  new major
       versions.

       The scale and sign of the value may be significant.

       If a previously used seed value is assigned to seed and used again, the
       pseudo-random number  generator	is  guaranteed	to  produce  the  same
       sequence	 of  pseudo-random  numbers  as	it did when the	seed value was
       previously used.

       The exact value assigned	to seed	is not guaranteed to  be  returned  if
       seed  is	 queried  again	 immediately.	However, if seed does return a
       different value,	both values, when assigned to seed, are	guaranteed  to
       produce	the  same  sequence of pseudo-random numbers.  This means that
       certain values assigned to seed will not	produce	 unique	 sequences  of
       pseudo-random  numbers.	The value of seed will change after any	use of
       the rand() and irand(E) operands	(see the Operands  subsection  below),
       except if the parameter passed to irand(E) is 0,	1, or negative.

       There  is no limit to the length	(number	of significant decimal digits)
       or scale	of the value that can be assigned to seed.

       Variables and arrays do not interfere; users can	have arrays named  the
       same  as	 variables.  This also applies to functions (see the FUNCTIONS
       section), so a user can have a variable,	array, and function  that  all
       have the	same name, and they will not shadow each other,	whether	inside
       of functions or not.

       Named  expressions  are	required as the	operand	of increment/decrement
       operators and as	 the  left  side  of  assignment  operators  (see  the
       Operators subsection).

   Operands
       The following are valid operands	in bc(1):

	1. Numbers (see	the Numbers subsection below).

	2. Array indices (I[E]).

	3. (E):	The value of E (used to	change precedence).

	4. sqrt(E): The	square root of E.  E must be non-negative.

	5. length(E):  The number of significant decimal digits	in E.  Returns
	   1 for 0 with	no decimal places.  If given a string, the  length  of
	   the	string	is  returned.	Passing	 a  string  to	length(E) is a
	   non-portable	extension.

	6. length(I[]):	The number of elements in the  array  I.   This	 is  a
	   non-portable	extension.

	7. scale(E): The scale of E.

	8. abs(E): The absolute	value of E.  This is a non-portable extension.

	9. is_number(E):  1  if	 the  given argument is	a number, 0 if it is a
	   string.  This is a non-portable extension.

       10. is_string(E): 1 if the given	argument is a string, 0	 if  it	 is  a
	   number.  This is a non-portable extension.

       11. modexp(E, E,	E): Modular exponentiation, where the first expression
	   is  the  base,  the	second	is  the	exponent, and the third	is the
	   modulus.  All three values must be integers.	 The  second  argument
	   must	 be  non-negative.  The	third argument must be non-zero.  This
	   is a	non-portable extension.

       12. divmod(E, E,	I[]): Division and modulus in one operation.  This  is
	   for	optimization.	The  first expression is the dividend, and the
	   second is the divisor, which	must be	non-zero.  The return value is
	   the quotient, and the modulus is stored in index 0 of the  provided
	   array (the last argument).  This is a non-portable extension.

       13. asciify(E):	If  E  is a string, returns a string that is the first
	   letter of its argument.  If it is a number, calculates  the	number
	   mod 256 and returns that number as a	one-character string.  This is
	   a non-portable extension.

       14. asciify(I[]): A string that is made up of the characters that would
	   result  from	 running  asciify(E)  on  each	element	 of  the array
	   identified by the argument.	This allows  creating  multi-character
	   strings and storing them.  This is a	non-portable extension.

       15. I(),	 I(E),	I(E,  E),  and	so  on,	where I	is an identifier for a
	   non-void  function  (see  the  Void	Functions  subsection  of  the
	   FUNCTIONS  section).	  The  E argument(s) may also be arrays	of the
	   form	I[], which will	automatically be turned	into array  references
	   (see	 the  Array References subsection of the FUNCTIONS section) if
	   the corresponding parameter in the function definition is an	 array
	   reference.

       16. read():  Reads  a  line  from stdin and uses	that as	an expression.
	   The result of that expression is the	result of the read()  operand.
	   This	is a non-portable extension.

       17. maxibase():	The  max  allowable  ibase.   This  is	a non-portable
	   extension.

       18. maxobase(): The  max	 allowable  obase.   This  is  a  non-portable
	   extension.

       19. maxscale():	The  max  allowable  scale.   This  is	a non-portable
	   extension.

       20. line_length(): The line length set  with  BC_LINE_LENGTH  (see  the
	   ENVIRONMENT VARIABLES section).  This is a non-portable extension.

       21. global_stacks():  0 if global stacks	are not	enabled	with the -g or
	   --global-stacks  options,  non-zero	otherwise.   See  the  OPTIONS
	   section.  This is a non-portable extension.

       22. leading_zero():  0 if leading zeroes	are not	enabled	with the -z or
	   -leading-zeroes  options,  non-zero	otherwise.   See  the  OPTIONS
	   section.  This is a non-portable extension.

       23. rand():   A	 pseudo-random	 integer  between  0  (inclusive)  and
	   BC_RAND_MAX (inclusive).  Using this	operand	will change the	 value
	   of seed.  This is a non-portable extension.

       24. irand(E):  A	 pseudo-random	integer	 between 0 (inclusive) and the
	   value of E (exclusive).  If E is negative or	is a non-integer  (E's
	   scale  is  not  0),	an  error is raised, and bc(1) resets (see the
	   RESET section) while	seed remains unchanged.	 If E is  larger  than
	   BC_RAND_MAX,	 the  higher  bound  is	 honored by generating several
	   pseudo-random integers, multiplying them by appropriate  powers  of
	   BC_RAND_MAX+1, and adding them together.  Thus, the size of integer
	   that	 can  be generated with	this operand is	unbounded.  Using this
	   operand will	change the value of seed, unless the value of E	 is  0
	   or  1.  In that case, 0 is returned,	and seed is not	changed.  This
	   is a	non-portable extension.

       25. maxrand():  The  max	 integer  returned  by	rand().	  This	is   a
	   non-portable	extension.

       The  integers  generated	by rand() and irand(E) are guaranteed to be as
       unbiased	as possible, subject to	the limitations	of  the	 pseudo-random
       number generator.

       Note:  The  values  returned by the pseudo-random number	generator with
       rand() and irand(E) are guaranteed to NOT be cryptographically  secure.
       This is a consequence of	using a	seeded pseudo-random number generator.
       However,	 they  are  guaranteed	to be reproducible with	identical seed
       values.	This means that	the pseudo-random  values  from	 bc(1)	should
       only  be	 used  where a reproducible stream of pseudo-random numbers is
       ESSENTIAL.  In any other	case, use a  non-seeded	 pseudo-random	number
       generator.

   Numbers
       Numbers are strings made	up of digits, uppercase	letters, and at	most 1
       period  for  a  radix.	Numbers	 can  have  up	to  BC_NUM_MAX digits.
       Uppercase letters are equal to 9	plus their position in	the  alphabet,
       starting	from 1 (i.e., A	equals 10, or 9+1).

       If  a  digit  or	 letter	makes no sense with the	current	value of ibase
       (i.e., they are greater than or equal to	the current value  of  ibase),
       then  the  behavior depends on the existence of the -c/--digit-clamp or
       -C/--no-digit-clamp options (see	the OPTIONS  section),	the  existence
       and  setting  of	 the  BC_DIGIT_CLAMP  environment  variable  (see  the
       ENVIRONMENT VARIABLES section), or the default, which  can  be  queried
       with the	-h/--help option.

       If  clamping  is	 off,  then digits or letters that are greater than or
       equal to	the current value of ibase are not  changed.   Instead,	 their
       given  value  is	multiplied by the appropriate power of ibase and added
       into the	number.	 This means that, with an ibase	of 3, the number AB is
       equal to	3^1*A+3^0*B, which is 3	times 10 plus 11, or 41.

       If clamping is on, then digits or letters  that	are  greater  than  or
       equal to	the current value of ibase are set to the value	of the highest
       valid  digit  in	ibase before being multiplied by the appropriate power
       of ibase	and added into the number.  This means that, with an ibase  of
       3, the number AB	is equal to 3^1*2+3^0*2, which is 3 times 2 plus 2, or
       8.

       There  is  one exception	to clamping: single-character numbers (i.e., A
       alone).	Such numbers are never clamped and always take the value  they
       would  have  in	the  highest  possible ibase.  This means that A alone
       always equals decimal 10	and Z alone always equals  decimal  35.	  This
       behavior	is mandated by the standard (see the STANDARDS section)	and is
       meant  to  provide  an  easy  way  to set the current ibase (with the i
       command)	regardless of the current value	of ibase.

       If clamping is on, and the clamped value	of a character is needed,  use
       a leading zero, i.e., for A, use	0A.

       In  addition, bc(1) accepts numbers in scientific notation.  These have
       the form	<number>e<integer>.  The exponent (the portion	after  the  e)
       must  be	 an  integer.	An  example  is	 1.89237e9,  which is equal to
       1892370000.  Negative exponents are also	allowed, so 4.2890e-3 is equal
       to 0.0042890.

       Using scientific	notation is an error or	 warning  if  the  -s  or  -w,
       respectively, command-line options (or equivalents) are given.

       WARNING:	 Both  the  number and the exponent in scientific notation are
       interpreted according to	the current ibase, but	the  number  is	 still
       multiplied  by  10^exponent  regardless	of  the	 current  ibase.   For
       example,	if ibase is 16 and bc(1) is given the number string FFeA,  the
       resulting  decimal  number will be 2550000000000, and if	bc(1) is given
       the number string 10e-4,	the resulting decimal number will be 0.0016.

       Accepting input as scientific notation is a non-portable	extension.

   Operators
       The following arithmetic	and logical operators can be used.   They  are
       listed  in order	of decreasing precedence.  Operators in	the same group
       have the	same precedence.

       ++ --  Type: Prefix and Postfix

	      Associativity: None

	      Description: increment, decrement

       - !    Type: Prefix

	      Associativity: None

	      Description: negation, boolean not

       $      Type: Postfix

	      Associativity: None

	      Description: truncation

       @      Type: Binary

	      Associativity: Right

	      Description: set precision

       ^      Type: Binary

	      Associativity: Right

	      Description: power

       * / %  Type: Binary

	      Associativity: Left

	      Description: multiply, divide, modulus

       + -    Type: Binary

	      Associativity: Left

	      Description: add,	subtract

       << >>  Type: Binary

	      Associativity: Left

	      Description: shift left, shift right

       = <<= >>= += -= *= /= %=	^= @=
	      Type: Binary

	      Associativity: Right

	      Description: assignment

       == <= >=	!= < >
	      Type: Binary

	      Associativity: Left

	      Description: relational

       &&     Type: Binary

	      Associativity: Left

	      Description: boolean and

       ||     Type: Binary

	      Associativity: Left

	      Description: boolean or

       The operators will be described in more detail below.

       ++ --  The prefix and postfix increment and decrement operators	behave
	      exactly  like  they  would in C. They require a named expression
	      (see the Named Expressions subsection) as	an operand.

	      The prefix versions of these operators are more  efficient;  use
	      them where possible.

       -      The negation operator returns 0 if a user	attempts to negate any
	      expression   with	 the  value  0.	  Otherwise,  a	 copy  of  the
	      expression with its sign flipped is returned.

       !      The boolean not operator returns 1 if the	expression is 0, or  0
	      otherwise.

	      Warning:	This  operator	has  a	different  precedence than the
	      equivalent   operator   in   GNU	 bc(1)	 and	other	 bc(1)
	      implementations!

	      This is a	non-portable extension.

       $      The  truncation  operator	returns	a copy of the given expression
	      with all of its scale removed.

	      This is a	non-portable extension.

       @      The set precision	operator takes two expressions and  returns  a
	      copy  of	the  first  with  its  scale equal to the value	of the
	      second expression.  That could either mean that  the  number  is
	      returned	without	 change	 (if the scale of the first expression
	      matches the value	of the second expression), extended (if	it  is
	      less), or	truncated (if it is more).

	      The  second  expression  must  be	 an  integer  (no  scale)  and
	      non-negative.

	      This is a	non-portable extension.

       ^      The power	operator (not the exclusive or operator, as  it	 would
	      be in C) takes two expressions and raises	the first to the power
	      of the value of the second.  The scale of	the result is equal to
	      scale.

	      The  second  expression must be an integer (no scale), and if it
	      is negative, the first value must	be non-zero.

       *      The multiply operator takes two  expressions,  multiplies	 them,
	      and  returns  the	 product.   If	a  is  the  scale of the first
	      expression and b is the scale  of	 the  second  expression,  the
	      scale  of	 the  result is	equal to min(a+b,max(scale,a,b)) where
	      min() and	max() return the obvious values.

       /      The divide operator takes	two  expressions,  divides  them,  and
	      returns  the  quotient.	The  scale  of the result shall	be the
	      value of scale.

	      The second expression must be non-zero.

       %      The modulus  operator  takes  two	 expressions,  a  and  b,  and
	      evaluates	them by	1) Computing a/b to current scale and 2) Using
	      the   result   of	  step	1  to  calculate  a-(a/b)*b  to	 scale
	      max(scale+scale(b),scale(a)).

	      The second expression must be non-zero.

       +      The add operator takes two expressions, a	and b, and returns the
	      sum, with	a scale	equal to the max of the	scales of a and	b.

       -      The subtract operator  takes  two	 expressions,  a  and  b,  and
	      returns  the  difference,	 with  a scale equal to	the max	of the
	      scales of	a and b.

       <<     The left shift operator takes two	 expressions,  a  and  b,  and
	      returns  a copy of the value of a	with its decimal point moved b
	      places to	the right.

	      The  second  expression  must  be	 an  integer  (no  scale)  and
	      non-negative.

	      This is a	non-portable extension.

       >>     The  right  shift	 operator  takes two expressions, a and	b, and
	      returns a	copy of	the value of a with its	decimal	point moved  b
	      places to	the left.

	      The  second  expression  must  be	 an  integer  (no  scale)  and
	      non-negative.

	      This is a	non-portable extension.

       = <<= >>= += -= *= /= %=	^= @=
	      The assignment operators take two	expressions, a and b  where  a
	      is a named expression (see the Named Expressions subsection).

	      For  =,  b  is  copied and the result is assigned	to a.  For all
	      others, a	and b are applied as  operands	to  the	 corresponding
	      arithmetic operator and the result is assigned to	a.

	      The  assignment  operators that correspond to operators that are
	      extensions are themselves	non-portable extensions.

       == <= >=	!= < >
	      The relational operators compare two expressions,	a and  b,  and
	      if  the  relation	 holds,	according to C language	semantics, the
	      result is	1.  Otherwise, it is 0.

	      Note that	unlike in C, these operators have a  lower  precedence
	      than  the	 assignment  operators,	 which	means  that  a=b>c  is
	      interpreted as (a=b)>c.

	      Also, unlike the standard	(see the STANDARDS section)  requires,
	      these operators can appear anywhere any other expressions	can be
	      used.  This allowance is a non-portable extension.

       &&     The  boolean and operator	takes two expressions and returns 1 if
	      both expressions are non-zero, 0 otherwise.

	      This is not a short-circuit operator.

	      This is a	non-portable extension.

       ||     The boolean or operator takes two	expressions and	returns	 1  if
	      one of the expressions is	non-zero, 0 otherwise.

	      This is not a short-circuit operator.

	      This is a	non-portable extension.

   Statements
       The following items are statements:

	1. E

	2. { S ; ...  ;	S }

	3. if (	E ) S

	4. if (	E ) S else S

	5. while ( E ) S

	6. for ( E ; E ; E ) S

	7. An empty statement

	8. break

	9. continue

       10. quit

       11. halt

       12. limits

       13. A string of characters, enclosed in double quotes

       14. print E , ...  , E

       15. stream E , ...  , E

       16. I(),	 I(E), I(E, E),	and so on, where I is an identifier for	a void
	   function (see  the  Void  Functions	subsection  of	the  FUNCTIONS
	   section).   The  E  argument(s) may also be arrays of the form I[],
	   which will automatically be turned into array references  (see  the
	   Array  References  subsection  of  the  FUNCTIONS  section)	if the
	   corresponding parameter in the  function  definition	 is  an	 array
	   reference.

       Numbers 4, 9, 11, 12, 14, 15, and 16 are	non-portable extensions.

       Also, as	a non-portable extension, any or all of	the expressions	in the
       header  of  a  for  loop	 may  be  omitted.   If	 the condition (second
       expression) is omitted, it is assumed to	be a constant 1.

       The break  statement  causes  a	loop  to  stop	iterating  and	resume
       execution immediately following a loop.	This is	only allowed in	loops.

       The  continue  statement	 causes	 a  loop  iteration  to	stop early and
       returns to the start of the loop, including testing the loop condition.
       This is only allowed in loops.

       The if else statement does the same thing as in C.

       The quit	statement causes bc(1) to quit,	even if	it is on a branch that
       will not	be executed (it	is a compile-time command).

       Warning:	The behavior of	this bc(1) on quit is slightly different  from
       other  bc(1) implementations.  Other bc(1) implementations will exit as
       soon as they finish parsing the line that a quit	command	is  on.	  This
       bc(1)  will  execute any	completed and executable statements that occur
       before the quit statement before	exiting.

       In other	words, for the bc(1) code below:

	      for (i = 0; i < 3; ++i) i; quit

       Other bc(1) implementations will	print nothing,	and  this  bc(1)  will
       print 0,	1, and 2 on successive lines before exiting.

       The  halt  statement  causes bc(1) to quit, if it is executed.  (Unlike
       quit if it is on	a branch of an if  statement  that  is	not  executed,
       bc(1) does not quit.)

       The  limits  statement prints the limits	that this bc(1)	is subject to.
       This is like the	quit statement in that it is a compile-time command.

       An expression by	 itself	 is  evaluated	and  printed,  followed	 by  a
       newline.

       Both  scientific	 notation  and	engineering notation are available for
       printing	the results of expressions.  Scientific	notation is  activated
       by  assigning  0	 to  obase,  and  engineering notation is activated by
       assigning 1 to obase.  To deactivate  them,  just  assign  a  different
       value to	obase.

       Scientific  notation  and engineering notation are disabled if bc(1) is
       run with	either the -s or -w command-line options (or equivalents).

       Printing	numbers	in scientific notation and/or engineering notation  is
       a non-portable extension.

   Strings
       If  strings  appear  as	a  statement  by  themselves, they are printed
       without a trailing newline.

       In addition to appearing	as a lone statement by themselves, strings can
       be assigned to variables	and array elements.  They can also  be	passed
       to functions in variable	parameters.

       If  any	statement that expects a string	is given a variable that had a
       string assigned to it, the statement acts as though it had  received  a
       string.

       If  any	math operation is attempted on a string	or a variable or array
       element that has	been assigned a	string,	an error is raised, and	 bc(1)
       resets (see the RESET section).

       Assigning  strings  to variables	and array elements and passing them to
       functions are non-portable extensions.

   Print Statement
       The "expressions" in a print statement may also be  strings.   If  they
       are,   there  are  backslash  escape  sequences	that  are  interpreted
       specially.  What	those  sequences  are,	and  what  they	 cause	to  be
       printed,	are shown below:

       \a: \a

       \b: \b

       \\: \

       \e: \

       \f: \f

       \n: \n

       \q: "

       \r: \r

       \t: \t

       Any  other  character  following	 a  backslash causes the backslash and
       character to be printed as-is.

       Any non-string expression in a print statement  shall  be  assigned  to
       last, like any other expression that is printed.

   Stream Statement
       The expressions in a stream statement may also be strings.

       If a stream statement is	given a	string,	it prints the string as	though
       the  string  had	 appeared  as  its own statement.  In other words, the
       stream statement	prints strings normally, without a newline.

       If a stream statement is	given a	number,	a copy of it is	truncated  and
       its absolute value is calculated.  The result is	then printed as	though
       obase is	256 and	each digit is interpreted as an	8-bit ASCII character,
       making it a byte	stream.

   Order of Evaluation
       All  expressions	 in  a statment	are evaluated left to right, except as
       necessary to maintain order of operations.  This	 means,	 for  example,
       assuming	that i is equal	to 0, in the expression

	      a[i++] = i++

       the first (or 0th) element of a is set to 1, and	i is equal to 2	at the
       end of the expression.

       This includes function arguments.  Thus,	assuming i is equal to 0, this
       means that in the expression

	      x(i++, i++)

       the  first  argument  passed to x() is 0, and the second	argument is 1,
       while i is equal	to 2 before the	function starts	executing.

FUNCTIONS
       Function	definitions are	as follows:

	      define I(I,...,I){
		  auto I,...,I
		  S;...;S
		  return(E)
	      }

       Any I in	the parameter list or auto list	may be replaced	 with  I[]  to
       make  a parameter or auto var an	array, and any I in the	parameter list
       may be replaced with *I[] to  make  a  parameter	 an  array  reference.
       Callers	of  functions  that  take  array  references should not	put an
       asterisk	in the call; they must be called with  just  I[]  like	normal
       array parameters	and will be automatically converted into references.

       As  a  non-portable  extension, the opening brace of a define statement
       may appear on the next line.

       As a non-portable extension, the	return statement may also be in	one of
       the following forms:

       1. return

       2. return ( )

       3. return E

       The first two, or not specifying	a return statement, is	equivalent  to
       return  (0),  unless  the  function  is	a  void	function (see the Void
       Functions subsection below).

   Void	Functions
       Functions can also be void functions, defined as	follows:

	      define void I(I,...,I){
		  auto I,...,I
		  S;...;S
		  return
	      }

       They can	 only  be  used	 as  standalone	 expressions,  where  such  an
       expression would	be printed alone, except in a print statement.

       Void  functions	can  only  use	the first two return statements	listed
       above.  They can	also omit the return statement entirely.

       The word	"void" is not treated as a keyword; it is  still  possible  to
       have  variables,	 arrays, and functions named void.  The	word "void" is
       only treated specially right after the define keyword.

       This is a non-portable extension.

   Array References
       For any array in	the parameter list, if the array is  declared  in  the
       form

	      *I[]

       it  is  a  reference.   Any  changes  to	 the array in the function are
       reflected, when the function returns, to	the array that was passed in.

       Other than this,	all function arguments are passed by value.

       This is a non-portable extension.

LIBRARY
       All of the functions below, including the  functions  in	 the  extended
       math library (see the Extended Library subsection below), are available
       when  the -l or --mathlib command-line flags are	given, except that the
       extended	math library is	not available  when  the  -s  option,  the  -w
       option, or equivalents are given.

   Standard Library
       The   standard  (see  the  STANDARDS  section)  defines	the  following
       functions for the math library:

       s(x)   Returns the sine of x, which is assumed to be in radians.

	      This  is	a  transcendental  function  (see  the	Transcendental
	      Functions	subsection below).

       c(x)   Returns the cosine of x, which is	assumed	to be in radians.

	      This  is	a  transcendental  function  (see  the	Transcendental
	      Functions	subsection below).

       a(x)   Returns the arctangent of	x, in radians.

	      This  is	a  transcendental  function  (see  the	Transcendental
	      Functions	subsection below).

       l(x)   Returns the natural logarithm of x.

	      This  is	a  transcendental  function  (see  the	Transcendental
	      Functions	subsection below).

       e(x)   Returns the mathematical constant	e raised to the	power of x.

	      This  is	a  transcendental  function  (see  the	Transcendental
	      Functions	subsection below).

       j(x, n)
	      Returns the bessel integer order n (truncated) of	x.

	      This  is	a  transcendental  function  (see  the	Transcendental
	      Functions	subsection below).

   Extended Library
       The extended library is not loaded when the -s/--standard or  -w/--warn
       options are given since they are	not part of the	library	defined	by the
       standard	(see the STANDARDS section).

       The extended library is a non-portable extension.

       p(x, y)
	      Calculates x to the power	of y, even if y	is not an integer, and
	      returns the result to the	current	scale.

	      It is an error if	y is negative and x is 0.

	      This  is	a  transcendental  function  (see  the	Transcendental
	      Functions	subsection below).

       r(x, p)
	      Returns x	rounded	to p decimal places according to the  rounding
	      mode	   round	 half	     away	 from	     0
	      (https://en.wikipedia.org/wiki/Rounding#Round_half_away_from_zero).

       ceil(x, p)
	      Returns x	rounded	to p decimal places according to the  rounding
	      mode	      round	       away	      from	     0
	      (https://en.wikipedia.org/wiki/Rounding#Rounding_away_from_zero).

       f(x)   Returns the factorial of the truncated absolute value of x.

       max(a, b)
	      Returns a	if a is	greater	than b;	otherwise, returns b.

       min(a, b)
	      Returns a	if a is	less than b; otherwise,	returns	b.

       perm(n, k)
	      Returns the permutation of the truncated absolute	value of n  of
	      the  truncated  absolute	value  of  k,  if  k <=	n.  If not, it
	      returns 0.

       comb(n, k)
	      Returns the combination of the truncated absolute	value of n  of
	      the  truncated  absolute	value  of  k,  if  k <=	n.  If not, it
	      returns 0.

       fib(n) Returns the Fibonacci number of the truncated absolute value  of
	      n.

       l2(x)  Returns the logarithm base 2 of x.

	      This  is	a  transcendental  function  (see  the	Transcendental
	      Functions	subsection below).

       l10(x) Returns the logarithm base 10 of x.

	      This  is	a  transcendental  function  (see  the	Transcendental
	      Functions	subsection below).

       log(x, b)
	      Returns the logarithm base b of x.

	      This  is	a  transcendental  function  (see  the	Transcendental
	      Functions	subsection below).

       cbrt(x)
	      Returns the cube root of x.

       root(x, n)
	      Calculates the truncated value of	n, r, and returns the rth root
	      of x to the current scale.

	      If r is 0	or negative, this raises an error and causes bc(1)  to
	      reset  (see  the	RESET  section).   It also raises an error and
	      causes bc(1) to reset if r is even and x is negative.

       gcd(a, b)
	      Returns the greatest common divisor (factor)  of	the  truncated
	      absolute value of	a and the truncated absolute value of b.

       lcm(a, b)
	      Returns  the  least  common  multiple  of	the truncated absolute
	      value of a and the truncated absolute value of b.

       pi(p)  Returns pi to p decimal places.

	      This  is	a  transcendental  function  (see  the	Transcendental
	      Functions	subsection below).

       t(x)   Returns the tangent of x,	which is assumed to be in radians.

	      This  is	a  transcendental  function  (see  the	Transcendental
	      Functions	subsection below).

       a2(y, x)
	      Returns the arctangent of	y/x, in	radians.  If both y and	x  are
	      equal  to	 0,  it	raises an error	and causes bc(1) to reset (see
	      the RESET	section).  Otherwise, if  x  is	 greater  than	0,  it
	      returns  a(y/x).	 If x is less than 0, and y is greater than or
	      equal to 0, it returns a(y/x)+pi.	 If x is less than 0, and y is
	      less than	0, it returns a(y/x)-pi.  If x is equal	to 0, and y is
	      greater than 0, it returns pi/2.	If x is	equal to 0, and	 y  is
	      less than	0, it returns -pi/2.

	      This  function  is  the  same  as	 the  atan2() function in many
	      programming languages.

	      This  is	a  transcendental  function  (see  the	Transcendental
	      Functions	subsection below).

       sin(x) Returns the sine of x, which is assumed to be in radians.

	      This is an alias of s(x).

	      This  is	a  transcendental  function  (see  the	Transcendental
	      Functions	subsection below).

       cos(x) Returns the cosine of x, which is	assumed	to be in radians.

	      This is an alias of c(x).

	      This  is	a  transcendental  function  (see  the	Transcendental
	      Functions	subsection below).

       tan(x) Returns the tangent of x,	which is assumed to be in radians.

	      If  x is equal to	1 or -1, this raises an	error and causes bc(1)
	      to reset (see the	RESET section).

	      This is an alias of t(x).

	      This  is	a  transcendental  function  (see  the	Transcendental
	      Functions	subsection below).

       atan(x)
	      Returns the arctangent of	x, in radians.

	      This is an alias of a(x).

	      This  is	a  transcendental  function  (see  the	Transcendental
	      Functions	subsection below).

       atan2(y,	x)
	      Returns the arctangent of	y/x, in	radians.  If both y and	x  are
	      equal  to	 0,  it	raises an error	and causes bc(1) to reset (see
	      the RESET	section).  Otherwise, if  x  is	 greater  than	0,  it
	      returns  a(y/x).	 If x is less than 0, and y is greater than or
	      equal to 0, it returns a(y/x)+pi.	 If x is less than 0, and y is
	      less than	0, it returns a(y/x)-pi.  If x is equal	to 0, and y is
	      greater than 0, it returns pi/2.	If x is	equal to 0, and	 y  is
	      less than	0, it returns -pi/2.

	      This  function  is  the  same  as	 the  atan2() function in many
	      programming languages.

	      This is an alias of a2(y,	x).

	      This  is	a  transcendental  function  (see  the	Transcendental
	      Functions	subsection below).

       r2d(x) Converts x from radians to degrees and returns the result.

	      This  is	a  transcendental  function  (see  the	Transcendental
	      Functions	subsection below).

       d2r(x) Converts x from degrees to radians and returns the result.

	      This  is	a  transcendental  function  (see  the	Transcendental
	      Functions	subsection below).

       frand(p)
	      Generates	 a  pseudo-random  number  between 0 (inclusive) and 1
	      (exclusive) with the number of decimal digits after the  decimal
	      point  equal  to the truncated absolute value of p.  If p	is not
	      0, then calling this function will change	the value of seed.  If
	      p	is 0, then 0 is	returned, and seed is not changed.

       ifrand(i, p)
	      Generates	a pseudo-random	number that is between	0  (inclusive)
	      and  the	truncated  absolute  value  of	i (exclusive) with the
	      number of	decimal	digits after the decimal point	equal  to  the
	      truncated	 absolute  value  of p.	 If the	absolute value of i is
	      greater than or equal to 2, and p	is not 0,  then	 calling  this
	      function	will  change  the  value  of  seed;  otherwise,	 0  is
	      returned,	and seed is not	changed.

       i2rand(a, b)
	      Takes the	truncated value	of a and b and uses them as  inclusive
	      bounds to	enerate	a pseudo-random	integer.  If the difference of
	      the  truncated  values of	a and b	is 0, then the truncated value
	      is returned, and seed is not changed.  Otherwise,	this  function
	      will change the value of seed.

       srand(x)
	      Returns  x with its sign flipped with probability	0.5.  In other
	      words, it	randomizes the sign of x.

       brand()
	      Returns a	random boolean value (either 0 or 1).

       band(a, b)
	      Takes  the  truncated  absolute  value  of  both	a  and	b  and
	      calculates  and  returns the result of the bitwise and operation
	      between them.

	      If you want to use signed	two's complement arguments, use	s2u(x)
	      to convert.

       bor(a, b)
	      Takes  the  truncated  absolute  value  of  both	a  and	b  and
	      calculates  and  returns	the result of the bitwise or operation
	      between them.

	      If you want to use signed	two's complement arguments, use	s2u(x)
	      to convert.

       bxor(a, b)
	      Takes  the  truncated  absolute  value  of  both	a  and	b  and
	      calculates  and  returns the result of the bitwise xor operation
	      between them.

	      If you want to use signed	two's complement arguments, use	s2u(x)
	      to convert.

       bshl(a, b)
	      Takes  the  truncated  absolute  value  of  both	a  and	b  and
	      calculates  and  returns	the  result of a bit-shifted left by b
	      places.

	      If you want to use signed	two's complement arguments, use	s2u(x)
	      to convert.

       bshr(a, b)
	      Takes  the  truncated  absolute  value  of  both	a  and	b  and
	      calculates  and  returns	the  truncated result of a bit-shifted
	      right by b places.

	      If you want to use signed	two's complement arguments, use	s2u(x)
	      to convert.

       bnotn(x,	n)
	      Takes the	truncated absolute value of x and does a  bitwise  not
	      as  though  it  has  the	same  number of	bytes as the truncated
	      absolute value of	n.

	      If you want to a	use  signed  two's  complement	argument,  use
	      s2u(x) to	convert.

       bnot8(x)
	      Does  a  bitwise	not  of	 the  truncated	absolute value of x as
	      though it	has 8 binary digits (1 unsigned	byte).

	      If you want to a	use  signed  two's  complement	argument,  use
	      s2u(x) to	convert.

       bnot16(x)
	      Does  a  bitwise	not  of	 the  truncated	absolute value of x as
	      though it	has 16 binary digits (2	unsigned bytes).

	      If you want to a	use  signed  two's  complement	argument,  use
	      s2u(x) to	convert.

       bnot32(x)
	      Does  a  bitwise	not  of	 the  truncated	absolute value of x as
	      though it	has 32 binary digits (4	unsigned bytes).

	      If you want to a	use  signed  two's  complement	argument,  use
	      s2u(x) to	convert.

       bnot64(x)
	      Does  a  bitwise	not  of	 the  truncated	absolute value of x as
	      though it	has 64 binary digits (8	unsigned bytes).

	      If you want to a	use  signed  two's  complement	argument,  use
	      s2u(x) to	convert.

       bnot(x)
	      Does  a  bitwise	not  of	 the  truncated	absolute value of x as
	      though it	has the	minimum	number of power	of two unsigned	bytes.

	      If you want to a	use  signed  two's  complement	argument,  use
	      s2u(x) to	convert.

       brevn(x,	n)
	      Runs  a  bit  reversal  on  the truncated	absolute value of x as
	      though it	has the	same number of 8-bit bytes  as	the  truncated
	      absolute value of	n.

	      If  you  want  to	 a  use	 signed	two's complement argument, use
	      s2u(x) to	convert.

       brev8(x)
	      Runs a bit reversal on the truncated  absolute  value  of	 x  as
	      though it	has 8 binary digits (1 unsigned	byte).

	      If  you  want  to	 a  use	 signed	two's complement argument, use
	      s2u(x) to	convert.

       brev16(x)
	      Runs a bit reversal on the truncated  absolute  value  of	 x  as
	      though it	has 16 binary digits (2	unsigned bytes).

	      If  you  want  to	 a  use	 signed	two's complement argument, use
	      s2u(x) to	convert.

       brev32(x)
	      Runs a bit reversal on the truncated  absolute  value  of	 x  as
	      though it	has 32 binary digits (4	unsigned bytes).

	      If  you  want  to	 a  use	 signed	two's complement argument, use
	      s2u(x) to	convert.

       brev64(x)
	      Runs a bit reversal on the truncated  absolute  value  of	 x  as
	      though it	has 64 binary digits (8	unsigned bytes).

	      If  you  want  to	 a  use	 signed	two's complement argument, use
	      s2u(x) to	convert.

       brev(x)
	      Runs a bit reversal on the truncated  absolute  value  of	 x  as
	      though it	has the	minimum	number of power	of two unsigned	bytes.

	      If  you  want  to	 a  use	 signed	two's complement argument, use
	      s2u(x) to	convert.

       broln(x,	p, n)
	      Does a left bitwise rotatation of	the truncated  absolute	 value
	      of  x,  as though	it has the same	number of unsigned 8-bit bytes
	      as the truncated absolute	value of n, by the  number  of	places
	      equal  to	 the  truncated	absolute value of p modded by the 2 to
	      the power	of the number of binary	digits in n 8-bit bytes.

	      If you want to a	use  signed  two's  complement	argument,  use
	      s2u(x) to	convert.

       brol8(x,	p)
	      Does  a  left bitwise rotatation of the truncated	absolute value
	      of x, as though it has 8 binary digits (1	unsigned byte),	by the
	      number of	places equal to	the  truncated	absolute  value	 of  p
	      modded by	2 to the power of 8.

	      If  you  want  to	 a  use	 signed	two's complement argument, use
	      s2u(x) to	convert.

       brol16(x, p)
	      Does a left bitwise rotatation of	the truncated  absolute	 value
	      of  x,  as though	it has 16 binary digits	(2 unsigned bytes), by
	      the number of places equal to the	truncated absolute value of  p
	      modded by	2 to the power of 16.

	      If  you  want  to	 a  use	 signed	two's complement argument, use
	      s2u(x) to	convert.

       brol32(x, p)
	      Does a left bitwise rotatation of	the truncated  absolute	 value
	      of  x,  as though	it has 32 binary digits	(4 unsigned bytes), by
	      the number of places equal to the	truncated absolute value of  p
	      modded by	2 to the power of 32.

	      If  you  want  to	 a  use	 signed	two's complement argument, use
	      s2u(x) to	convert.

       brol64(x, p)
	      Does a left bitwise rotatation of	the truncated  absolute	 value
	      of  x,  as though	it has 64 binary digits	(8 unsigned bytes), by
	      the number of places equal to the	truncated absolute value of  p
	      modded by	2 to the power of 64.

	      If  you  want  to	 a  use	 signed	two's complement argument, use
	      s2u(x) to	convert.

       brol(x, p)
	      Does a left bitwise rotatation of	the truncated  absolute	 value
	      of  x,  as  though  it  has  the	minimum	number of power	of two
	      unsigned 8-bit bytes, by the  number  of	places	equal  to  the
	      truncated	 absolute  value  of p modded by 2 to the power	of the
	      number of	binary digits in the minimum number of 8-bit bytes.

	      If you want to a	use  signed  two's  complement	argument,  use
	      s2u(x) to	convert.

       brorn(x,	p, n)
	      Does  a right bitwise rotatation of the truncated	absolute value
	      of x, as though it has the same number of	unsigned  8-bit	 bytes
	      as  the  truncated  absolute value of n, by the number of	places
	      equal to the truncated absolute value of p modded	by  the	 2  to
	      the power	of the number of binary	digits in n 8-bit bytes.

	      If  you  want  to	 a  use	 signed	two's complement argument, use
	      s2u(x) to	convert.

       bror8(x,	p)
	      Does a right bitwise rotatation of the truncated absolute	 value
	      of x, as though it has 8 binary digits (1	unsigned byte),	by the
	      number  of  places  equal	 to  the truncated absolute value of p
	      modded by	2 to the power of 8.

	      If you want to a	use  signed  two's  complement	argument,  use
	      s2u(x) to	convert.

       bror16(x, p)
	      Does  a right bitwise rotatation of the truncated	absolute value
	      of x, as though it has 16	binary digits (2 unsigned  bytes),  by
	      the  number of places equal to the truncated absolute value of p
	      modded by	2 to the power of 16.

	      If you want to a	use  signed  two's  complement	argument,  use
	      s2u(x) to	convert.

       bror32(x, p)
	      Does  a right bitwise rotatation of the truncated	absolute value
	      of x, as though it has 32	binary digits (2 unsigned  bytes),  by
	      the  number of places equal to the truncated absolute value of p
	      modded by	2 to the power of 32.

	      If you want to a	use  signed  two's  complement	argument,  use
	      s2u(x) to	convert.

       bror64(x, p)
	      Does  a right bitwise rotatation of the truncated	absolute value
	      of x, as though it has 64	binary digits (2 unsigned  bytes),  by
	      the  number of places equal to the truncated absolute value of p
	      modded by	2 to the power of 64.

	      If you want to a	use  signed  two's  complement	argument,  use
	      s2u(x) to	convert.

       bror(x, p)
	      Does  a right bitwise rotatation of the truncated	absolute value
	      of x, as though it has  the  minimum  number  of	power  of  two
	      unsigned	8-bit  bytes,  by  the	number	of places equal	to the
	      truncated	absolute value of p modded by 2	to the	power  of  the
	      number of	binary digits in the minimum number of 8-bit bytes.

	      If  you  want  to	 a  use	 signed	two's complement argument, use
	      s2u(x) to	convert.

       bmodn(x,	n)
	      Returns the modulus of the truncated absolute value of x by 2 to
	      the power	of the multiplication of the truncated absolute	 value
	      of n and 8.

	      If  you  want  to	 a  use	 signed	two's complement argument, use
	      s2u(x) to	convert.

       bmod8(x,	n)
	      Returns the modulus of the truncated absolute value of x by 2 to
	      the power	of 8.

	      If you want to a	use  signed  two's  complement	argument,  use
	      s2u(x) to	convert.

       bmod16(x, n)
	      Returns the modulus of the truncated absolute value of x by 2 to
	      the power	of 16.

	      If  you  want  to	 a  use	 signed	two's complement argument, use
	      s2u(x) to	convert.

       bmod32(x, n)
	      Returns the modulus of the truncated absolute value of x by 2 to
	      the power	of 32.

	      If you want to a	use  signed  two's  complement	argument,  use
	      s2u(x) to	convert.

       bmod64(x, n)
	      Returns the modulus of the truncated absolute value of x by 2 to
	      the power	of 64.

	      If  you  want  to	 a  use	 signed	two's complement argument, use
	      s2u(x) to	convert.

       bunrev(t)
	      Assumes t	is a bitwise-reversed number with an extra set bit one
	      place more significant than the real most	significant bit	(which
	      was the least significant	bit in	the  original  number).	  This
	      number is	reversed and returned without the extra	set bit.

	      This  function  is used to implement other bitwise functions; it
	      is not meant to be used by users,	but it can be.

       plz(x) If x is not equal	to 0 and greater that -1 and less than	1,  it
	      is  printed with a leading zero, regardless of the use of	the -z
	      option (see the OPTIONS section) and without a trailing newline.

	      Otherwise, x is printed normally,	without	a trailing newline.

       plznl(x)
	      If x is not equal	to 0 and greater that -1 and less than	1,  it
	      is  printed with a leading zero, regardless of the use of	the -z
	      option (see the OPTIONS section) and with	a trailing newline.

	      Otherwise, x is printed normally,	with a trailing	newline.

       pnlz(x)
	      If x is not equal	to 0 and greater that -1 and less than	1,  it
	      is  printed without a leading zero, regardless of	the use	of the
	      -z option	(see the  OPTIONS  section)  and  without  a  trailing
	      newline.

	      Otherwise, x is printed normally,	without	a trailing newline.

       pnlznl(x)
	      If  x  is	not equal to 0 and greater that	-1 and less than 1, it
	      is printed without a leading zero, regardless of the use of  the
	      -z option	(see the OPTIONS section) and with a trailing newline.

	      Otherwise, x is printed normally,	with a trailing	newline.

       ubytes(x)
	      Returns  the  numbers of unsigned	integer	bytes required to hold
	      the truncated absolute value of x.

       sbytes(x)
	      Returns the numbers of signed,  two's-complement	integer	 bytes
	      required to hold the truncated value of x.

       s2u(x) Returns  x  if  it  is non-negative.  If it is negative, then it
	      calculates what x	would be as a  2's-complement  signed  integer
	      and  returns  the	 non-negative integer that would have the same
	      representation in	binary.

       s2un(x,n)
	      Returns x	if it is non-negative.	If it  is  negative,  then  it
	      calculates  what	x  would be as a 2's-complement	signed integer
	      with n bytes and returns the  non-negative  integer  that	 would
	      have  the	same representation in binary.	If x cannot fit	into n
	      2's-complement signed bytes, it is truncated to fit.

       hex(x) Outputs the hexadecimal (base 16)	representation of x.

	      This is a	void function (see the Void  Functions	subsection  of
	      the FUNCTIONS section).

       binary(x)
	      Outputs the binary (base 2) representation of x.

	      This  is	a  void	function (see the Void Functions subsection of
	      the FUNCTIONS section).

       output(x, b)
	      Outputs the base b representation	of x.

	      This is a	void function (see the Void  Functions	subsection  of
	      the FUNCTIONS section).

       uint(x)
	      Outputs  the  representation, in binary and hexadecimal, of x as
	      an unsigned integer in as	few power of two  bytes	 as  possible.
	      Both outputs are split into bytes	separated by spaces.

	      If  x  is	 not  an  integer  or is negative, an error message is
	      printed instead, but bc(1) is not	reset (see the RESET section).

	      This is a	void function (see the Void  Functions	subsection  of
	      the FUNCTIONS section).

       int(x) Outputs the representation, in binary and	hexadecimal, of	x as a
	      signed, two's-complement integer in as few power of two bytes as
	      possible.	  Both	outputs	 are  split  into  bytes  separated by
	      spaces.

	      If x is not an integer, an error message is printed instead, but
	      bc(1) is not reset (see the RESET	section).

	      This is a	void function (see the Void  Functions	subsection  of
	      the FUNCTIONS section).

       uintn(x,	n)
	      Outputs  the  representation, in binary and hexadecimal, of x as
	      an unsigned integer in n bytes.  Both  outputs  are  split  into
	      bytes separated by spaces.

	      If x is not an integer, is negative, or cannot fit into n	bytes,
	      an error message is printed instead, but bc(1) is	not reset (see
	      the RESET	section).

	      This  is	a  void	function (see the Void Functions subsection of
	      the FUNCTIONS section).

       intn(x, n)
	      Outputs the representation, in binary and	hexadecimal, of	x as a
	      signed, two's-complement integer in n bytes.  Both  outputs  are
	      split into bytes separated by spaces.

	      If  x  is	 not  an  integer or cannot fit	into n bytes, an error
	      message is printed instead, but bc(1)  is	 not  reset  (see  the
	      RESET section).

	      This  is	a  void	function (see the Void Functions subsection of
	      the FUNCTIONS section).

       uint8(x)
	      Outputs the representation, in binary and	hexadecimal, of	 x  as
	      an  unsigned  integer  in	 1  byte.  Both	outputs	are split into
	      bytes separated by spaces.

	      If x is not an integer, is negative, or cannot fit into 1	 byte,
	      an error message is printed instead, but bc(1) is	not reset (see
	      the RESET	section).

	      This  is	a  void	function (see the Void Functions subsection of
	      the FUNCTIONS section).

       int8(x)
	      Outputs the representation, in binary and	hexadecimal, of	x as a
	      signed, two's-complement integer in 1 byte.   Both  outputs  are
	      split into bytes separated by spaces.

	      If  x  is	 not  an  integer  or cannot fit into 1	byte, an error
	      message is printed instead, but bc(1)  is	 not  reset  (see  the
	      RESET section).

	      This  is	a  void	function (see the Void Functions subsection of
	      the FUNCTIONS section).

       uint16(x)
	      Outputs the representation, in binary and	hexadecimal, of	 x  as
	      an  unsigned  integer  in	 2 bytes.  Both	outputs	are split into
	      bytes separated by spaces.

	      If x is not an integer, is negative, or cannot fit into 2	bytes,
	      an error message is printed instead, but bc(1) is	not reset (see
	      the RESET	section).

	      This is a	void function (see the Void  Functions	subsection  of
	      the FUNCTIONS section).

       int16(x)
	      Outputs the representation, in binary and	hexadecimal, of	x as a
	      signed,  two's-complement	 integer in 2 bytes.  Both outputs are
	      split into bytes separated by spaces.

	      If x is not an integer or	cannot fit  into  2  bytes,  an	 error
	      message  is  printed  instead,  but  bc(1) is not	reset (see the
	      RESET section).

	      This is a	void function (see the Void  Functions	subsection  of
	      the FUNCTIONS section).

       uint32(x)
	      Outputs  the  representation, in binary and hexadecimal, of x as
	      an unsigned integer in 4 bytes.  Both  outputs  are  split  into
	      bytes separated by spaces.

	      If x is not an integer, is negative, or cannot fit into 4	bytes,
	      an error message is printed instead, but bc(1) is	not reset (see
	      the RESET	section).

	      This  is	a  void	function (see the Void Functions subsection of
	      the FUNCTIONS section).

       int32(x)
	      Outputs the representation, in binary and	hexadecimal, of	x as a
	      signed, two's-complement integer in 4 bytes.  Both  outputs  are
	      split into bytes separated by spaces.

	      If  x  is	 not  an  integer or cannot fit	into 4 bytes, an error
	      message is printed instead, but bc(1)  is	 not  reset  (see  the
	      RESET section).

	      This  is	a  void	function (see the Void Functions subsection of
	      the FUNCTIONS section).

       uint64(x)
	      Outputs the representation, in binary and	hexadecimal, of	 x  as
	      an  unsigned  integer  in	 8 bytes.  Both	outputs	are split into
	      bytes separated by spaces.

	      If x is not an integer, is negative, or cannot fit into 8	bytes,
	      an error message is printed instead, but bc(1) is	not reset (see
	      the RESET	section).

	      This is a	void function (see the Void  Functions	subsection  of
	      the FUNCTIONS section).

       int64(x)
	      Outputs the representation, in binary and	hexadecimal, of	x as a
	      signed,  two's-complement	 integer in 8 bytes.  Both outputs are
	      split into bytes separated by spaces.

	      If x is not an integer or	cannot fit  into  8  bytes,  an	 error
	      message  is  printed  instead,  but  bc(1) is not	reset (see the
	      RESET section).

	      This is a	void function (see the Void  Functions	subsection  of
	      the FUNCTIONS section).

       hex_uint(x, n)
	      Outputs  the representation of the truncated absolute value of x
	      as an unsigned integer in	hexadecimal using n bytes.  Not	all of
	      the value	will be	output if n is too small.

	      This is a	void function (see the Void  Functions	subsection  of
	      the FUNCTIONS section).

       binary_uint(x, n)
	      Outputs  the representation of the truncated absolute value of x
	      as an unsigned integer in	binary using n bytes.  Not all of  the
	      value will be output if n	is too small.

	      This  is	a  void	function (see the Void Functions subsection of
	      the FUNCTIONS section).

       output_uint(x, n)
	      Outputs the representation of the	truncated absolute value of  x
	      as  an  unsigned	integer	 in  the current obase (see the	SYNTAX
	      section) using n bytes.  Not all of the value will be output  if
	      n	is too small.

	      This  is	a  void	function (see the Void Functions subsection of
	      the FUNCTIONS section).

       output_byte(x, i)
	      Outputs byte i of	the truncated absolute value of	x, where 0  is
	      the  least  significant byte and number_of_bytes - 1 is the most
	      significant byte.

	      This is a	void function (see the Void  Functions	subsection  of
	      the FUNCTIONS section).

   Transcendental Functions
       All transcendental functions can	return slightly	inaccurate results, up
       to  1 ULP (https://en.wikipedia.org/wiki/Unit_in_the_last_place).  This
       is	 unavoidable,	     and	the	    article	    at
       https://people.eecs.berkeley.edu/~wkahan/LOG10HAF.TXT  explains	why it
       is impossible and  unnecessary  to  calculate  exact  results  for  the
       transcendental functions.

       Because	of  the	possible inaccuracy, I recommend that users call those
       functions with the precision (scale) set	to at least 1 higher  than  is
       necessary.   If exact results are absolutely required, users can	double
       the precision (scale) and then truncate.

       The transcendental functions in the standard math library are:

        s(x)

        c(x)

        a(x)

        l(x)

        e(x)

        j(x, n)

       The transcendental functions in the extended math library are:

        l2(x)

        l10(x)

        log(x,	b)

        pi(p)

        t(x)

        a2(y, x)

        sin(x)

        cos(x)

        tan(x)

        atan(x)

        atan2(y, x)

        r2d(x)

        d2r(x)

RESET
       When bc(1) encounters an	error or a signal that it  has	a  non-default
       handler for, it resets.	This means that	several	things happen.

       First,  any functions that are executing	are stopped and	popped off the
       stack.  The behavior is not unlike that of  exceptions  in  programming
       languages.  Then	the execution point is set so that any code waiting to
       execute (after all functions returned) is skipped.

       Thus,  when  bc(1)  resets,  it	skips any remaining code waiting to be
       executed.  Then,	if it is interactive mode, and the  error  was	not  a
       fatal  error  (see  the	EXIT  STATUS section), it asks for more	input;
       otherwise, it exits with	the appropriate	return code.

       Note that this reset behavior is	different from the  GNU	 bc(1),	 which
       attempts	 to  start  executing  the  statement right after the one that
       caused an error.

PERFORMANCE
       Most bc(1) implementations use char types to calculate the value	 of  1
       decimal	digit  at  a  time,  but  that	can  be	slow.  This bc(1) does
       something different.

       It uses large integers to calculate more	than  1	 decimal  digit	 at  a
       time.   If  built  in  a	 environment where BC_LONG_BIT (see the	LIMITS
       section)	is 64, then each integer has 9 decimal digits.	If built in an
       environment where BC_LONG_BIT is	32 then	each  integer  has  4  decimal
       digits.	This value (the	number of decimal digits per large integer) is
       called BC_BASE_DIGS.

       The  actual  values of BC_LONG_BIT and BC_BASE_DIGS can be queried with
       the limits statement.

       In addition, this bc(1)	uses  an  even	larger	integer	 for  overflow
       checking.   This	 integer type depends on the value of BC_LONG_BIT, but
       is always at least twice	as large as the	integer	 type  used  to	 store
       digits.

LIMITS
       The following are the limits on bc(1):

       BC_LONG_BIT
	      The  number  of  bits  in	the long type in the environment where
	      bc(1) was	built.	This determines	how many decimal digits	can be
	      stored in	a single large integer (see the	PERFORMANCE section).

       BC_BASE_DIGS
	      The  number  of  decimal	digits	per  large  integer  (see  the
	      PERFORMANCE section).  Depends on	BC_LONG_BIT.

       BC_BASE_POW
	      The  max	decimal	 number	that each large	integer	can store (see
	      BC_BASE_DIGS) plus 1.  Depends on	BC_BASE_DIGS.

       BC_OVERFLOW_MAX
	      The max number that  the	overflow  type	(see  the  PERFORMANCE
	      section) can hold.  Depends on BC_LONG_BIT.

       BC_BASE_MAX
	      The maximum output base.	Set at BC_BASE_POW.

       BC_DIM_MAX
	      The maximum size of arrays.  Set at SIZE_MAX-1.

       BC_SCALE_MAX
	      The maximum scale.  Set at BC_OVERFLOW_MAX-1.

       BC_STRING_MAX
	      The maximum length of strings.  Set at BC_OVERFLOW_MAX-1.

       BC_NAME_MAX
	      The maximum length of identifiers.  Set at BC_OVERFLOW_MAX-1.

       BC_NUM_MAX
	      The  maximum  length  of	a  number  (in	decimal	digits), which
	      includes	 digits	  after	  the	decimal	  point.     Set    at
	      BC_OVERFLOW_MAX-1.

       BC_RAND_MAX
	      The  maximum integer (inclusive) returned	by the rand() operand.
	      Set at 2^BC_LONG_BIT-1.

       Exponent
	      The maximum allowable exponent (positive or negative).   Set  at
	      BC_OVERFLOW_MAX.

       Number of vars
	      The maximum number of vars/arrays.  Set at SIZE_MAX-1.

       The actual values can be	queried	with the limits	statement.

       These  limits  are meant	to be effectively non-existent;	the limits are
       so large	(at least on 64-bit machines) that there  should  not  be  any
       point  at  which	 they  become  a  problem.   In	fact, memory should be
       exhausted before	these limits should be hit.

ENVIRONMENT VARIABLES
       As non-portable extensions, bc(1) recognizes the	following  environment
       variables:

       POSIXLY_CORRECT
	      If  this variable	exists (no matter the contents), bc(1) behaves
	      as if the	-s option was given.

       BC_ENV_ARGS
	      This is another way to give  command-line	 arguments  to	bc(1).
	      They  should  be	in  the	 same format as	all other command-line
	      arguments.  These	are always processed first, so any files given
	      in BC_ENV_ARGS will be  processed	 before	 arguments  and	 files
	      given  on	 the command-line.  This gives the user	the ability to
	      set up  "standard"  options  and	files  to  be  used  at	 every
	      invocation.   The	 most  useful  thing for such files to contain
	      would be useful functions	that the user might  want  every  time
	      bc(1) runs.

	      The  code	 that  parses BC_ENV_ARGS will correctly handle	quoted
	      arguments, but it	does not  understand  escape  sequences.   For
	      example,	the  string  "/home/gavin/some	bc  file.bc"  will  be
	      correctly	parsed,	but the	string "/home/gavin/some "bc" file.bc"
	      will include the backslashes.

	      The quote	parsing	will handle either kind	of  quotes,  '	or  ".
	      Thus, if you have	a file with any	number of single quotes	in the
	      name,  you  can  use  double quotes as the outside quotes, as in
	      "some `bc' file.bc", and vice versa if  you  have	 a  file  with
	      double  quotes.	However,  handling  a  file with both kinds of
	      quotes in	BC_ENV_ARGS is not supported due to the	complexity  of
	      the  parsing,  though  such  files  are  still  supported	on the
	      command-line where the parsing is	done by	the shell.

       BC_LINE_LENGTH
	      If this environment variable exists and contains an integer that
	      is greater than 1	and is less than  UINT16_MAX  (2^16-1),	 bc(1)
	      will  output  lines to that length, including the	backslash (\).
	      The default line length is 70.

	      The special value	of 0 will disable  line	 length	 checking  and
	      print   numbers  without	regard	to  line  length  and  without
	      backslashes and newlines.

       BC_BANNER
	      If this environment variable exists  and	contains  an  integer,
	      then  a non-zero value activates the copyright banner when bc(1)
	      is in interactive	mode, while zero deactivates it.

	      If bc(1) is not in interactive mode (see	the  INTERACTIVE  MODE
	      section),	 then  this environment	variable has no	effect because
	      bc(1) does not print the banner when not in interactive mode.

	      This environment variable	overrides the default,	which  can  be
	      queried with the -h or --help options.

       BC_SIGINT_RESET
	      If  bc(1)	 is  not in interactive	mode (see the INTERACTIVE MODE
	      section),	then this environment variable has no  effect  because
	      bc(1) exits on SIGINT when not in	interactive mode.

	      However,	when  bc(1)  is	 in  interactive  mode,	 then  if this
	      environment variable exists and contains an integer, a  non-zero
	      value  makes  bc(1)  reset on SIGINT, rather than	exit, and zero
	      makes bc(1) exit.	 If this environment variable  exists  and  is
	      not an integer, then bc(1) will exit on SIGINT.

	      This  environment	 variable  overrides the default, which	can be
	      queried with the -h or --help options.

       BC_TTY_MODE
	      If TTY mode is not available (see	the TTY	 MODE  section),  then
	      this environment variable	has no effect.

	      However,	when  TTY  mode	is available, then if this environment
	      variable exists and contains an integer, then a  non-zero	 value
	      makes bc(1) use TTY mode,	and zero makes bc(1) not use TTY mode.

	      This  environment	 variable  overrides the default, which	can be
	      queried with the -h or --help options.

       BC_PROMPT
	      If TTY mode is not available (see	the TTY	 MODE  section),  then
	      this environment variable	has no effect.

	      However,	when  TTY  mode	is available, then if this environment
	      variable exists and contains an integer, a non-zero value	 makes
	      bc(1)  use  a  prompt, and zero or a non-integer makes bc(1) not
	      use a prompt.  If	this environment variable does not  exist  and
	      BC_TTY_MODE  does, then the value	of the BC_TTY_MODE environment
	      variable is used.

	      This  environment	 variable  and	the  BC_TTY_MODE   environment
	      variable	override the default, which can	be queried with	the -h
	      or --help	options.

       BC_EXPR_EXIT
	      If  any  expressions  or	expression  files  are	given  on  the
	      command-line  with -e, --expression, -f, or --file, then if this
	      environment variable exists and contains an integer, a  non-zero
	      value  makes  bc(1)  exit	 after	executing  the expressions and
	      expression files,	and a zero value makes bc(1) not exit.

	      This environment variable	overrides the default,	which  can  be
	      queried with the -h or --help options.

       BC_DIGIT_CLAMP
	      When parsing numbers and if this environment variable exists and
	      contains	an  integer, a non-zero	value makes bc(1) clamp	digits
	      that are greater than or equal to	the current ibase so that  all
	      such  digits  are	 considered  equal to the ibase	minus 1, and a
	      zero value disables such	clamping  so  that  those  digits  are
	      always equal to their value, which is multiplied by the power of
	      the ibase.

	      This  never applies to single-digit numbers, as per the standard
	      (see the STANDARDS section).

	      This environment variable	overrides the default,	which  can  be
	      queried with the -h or --help options.

EXIT STATUS
       bc(1) returns the following exit	statuses:

       0      No error.

       1      A	 math error occurred.  This follows standard practice of using
	      1	for expected errors, since math	 errors	 will  happen  in  the
	      process of normal	execution.

	      Math  errors  include  divide  by	0, taking the square root of a
	      negative number, using a negative	number	as  a  bound  for  the
	      pseudo-random number generator, attempting to convert a negative
	      number  to a hardware integer, overflow when converting a	number
	      to a hardware integer, overflow when calculating the size	 of  a
	      number,  and attempting to use a non-integer where an integer is
	      required.

	      Converting to a hardware integer happens for the second  operand
	      of  the  power (^), places (@), left shift (<<), and right shift
	      (>>) operators and their corresponding assignment	operators.

       2      A	parse error occurred.

	      Parse errors include unexpected EOF, using an invalid character,
	      failing to find the end of a string or comment,  using  a	 token
	      where  it	 is  invalid,  giving an invalid expression, giving an
	      invalid print statement, giving an invalid function  definition,
	      attempting  to  assign  to  an  expression  that	is not a named
	      expression (see the Named	Expressions subsection of  the	SYNTAX
	      section),	 giving	 an  invalid  auto  list,  having  a duplicate
	      auto/function parameter, failing to  find	 the  end  of  a  code
	      block,  attempting  to  return  a	 value	from  a	void function,
	      attempting to use	a variable  as	a  reference,  and  using  any
	      extensions when the option -s or any equivalents were given.

       3      A	runtime	error occurred.

	      Runtime errors include assigning an invalid number to any	global
	      (ibase,  obase,  or  scale), giving a bad	expression to a	read()
	      call, calling read() inside  of  a  read()  call,	 type  errors,
	      passing  the  wrong number of arguments to functions, attempting
	      to call an undefined function, and  attempting  to  use  a  void
	      function call as a value in an expression.

       4      A	fatal error occurred.

	      Fatal  errors  include  memory  allocation  errors,  I/O errors,
	      failing to open files, attempting	to use files that do not  have
	      only  ASCII  characters  (bc(1)  only accepts ASCII characters),
	      attempting to open a directory as	a  file,  and  giving  invalid
	      command-line options.

       The  exit  status 4 is special; when a fatal error occurs, bc(1)	always
       exits and returns 4, no matter what mode	bc(1) is in.

       The other  statuses  will  only	be  returned  when  bc(1)  is  not  in
       interactive mode	(see the INTERACTIVE MODE section), since bc(1)	resets
       its  state  (see	 the RESET section) and	accepts	more input when	one of
       those errors occurs in interactive mode.	 This is also  the  case  when
       interactive mode	is forced by the -i flag or --interactive option.

       These  exit  statuses  allow  bc(1)  to be used in shell	scripting with
       error checking, and its normal behavior can be forced by	using  the  -i
       flag or --interactive option.

INTERACTIVE MODE
       Per  the	standard (see the STANDARDS section), bc(1) has	an interactive
       mode and	 a  non-interactive  mode.   Interactive  mode	is  turned  on
       automatically  when both	stdin and stdout are hooked to a terminal, but
       the  -i	flag  and  --interactive  option  can  turn  it	 on  in	 other
       situations.

       In  interactive	mode,  bc(1)  attempts to recover from errors (see the
       RESET section), and in normal execution,	 flushes  stdout  as  soon  as
       execution  is  done  for	 the  current  input.  bc(1) may also reset on
       SIGINT instead of exit, depending on the	contents of, or	 default  for,
       the BC_SIGINT_RESET environment variable	(see the ENVIRONMENT VARIABLES
       section).

TTY MODE
       If  stdin,  stdout,  and	 stderr	 are all connected to a	TTY, then "TTY
       mode" is	considered to be available, and	thus, bc(1) can	 turn  on  TTY
       mode, subject to	some settings.

       If  there  is  the  environment variable	BC_TTY_MODE in the environment
       (see the	ENVIRONMENT  VARIABLES	section),  then	 if  that  environment
       variable	 contains a non-zero integer, bc(1) will turn on TTY mode when
       stdin, stdout,  and  stderr  are	 all  connected	 to  a	TTY.   If  the
       BC_TTY_MODE  environment	variable exists	but is not a non-zero integer,
       then bc(1) will not turn	TTY mode on.

       If the environment variable BC_TTY_MODE does  not  exist,  the  default
       setting	is  used.   The	 default setting can be	queried	with the -h or
       --help options.

       TTY mode	is different from interactive mode because interactive mode is
       required	in  the	 bc(1)	standard  (see	the  STANDARDS	section),  and
       interactive  mode  requires  only stdin and stdout to be	connected to a
       terminal.

   Command-Line	History
       Command-line history is only enabled if TTY mode	is, i.e., that	stdin,
       stdout,	and  stderr  are  connected  to	 a  TTY	 and  the  BC_TTY_MODE
       environment variable (see the ENVIRONMENT VARIABLES  section)  and  its
       default	do not disable TTY mode.  See the COMMAND LINE HISTORY section
       for more	information.

   Prompt
       If TTY mode is available, then a	prompt can be enabled.	Like TTY  mode
       itself,	it  can	 be  turned  on	 or  off with an environment variable:
       BC_PROMPT (see the ENVIRONMENT VARIABLES	section).

       If the environment variable BC_PROMPT exists and	is a non-zero integer,
       then the	prompt is  turned  on  when  stdin,  stdout,  and  stderr  are
       connected  to  a	 TTY and the -P	and --no-prompt	options	were not used.
       The read	prompt will be turned on under	the  same  conditions,	except
       that the	-R and --no-read-prompt	options	must also not be used.

       However,	 if  BC_PROMPT	does  not  exist, the prompt can be enabled or
       disabled	 with  the  BC_TTY_MODE	 environment  variable,	 the  -P   and
       --no-prompt  options, and the -R	and --no-read-prompt options.  See the
       ENVIRONMENT VARIABLES and OPTIONS sections for more details.

SIGNAL HANDLING
       Sending a SIGINT	will cause bc(1) to do one of two things.

       If bc(1)	is not in interactive mode (see	the INTERACTIVE	MODE section),
       or  the	BC_SIGINT_RESET	 environment  variable	(see  the  ENVIRONMENT
       VARIABLES  section),  or	its default, is	either not an integer or it is
       zero, bc(1) will	exit.

       However,	if bc(1) is in interactive mode, and  the  BC_SIGINT_RESET  or
       its  default is an integer and non-zero,	then bc(1) will	stop executing
       the current input and reset (see	the RESET section)  upon  receiving  a
       SIGINT.

       Note  that  "current  input"  can  mean one of two things.  If bc(1) is
       processing input	from stdin in interactive mode,	it will	ask  for  more
       input.	If  bc(1) is processing	input from a file in interactive mode,
       it will stop processing the file	and start processing the next file, if
       one exists, or ask for input from stdin if no other file	exists.

       This means that if a SIGINT is sent to bc(1) as it is executing a file,
       it can seem as though bc(1) did not respond to the signal since it will
       immediately start executing the next file.  This	 is  by	 design;  most
       files  that  users  execute  when  interacting with bc(1) have function
       definitions, which are quick to parse.  If a file takes a long time  to
       execute,	 there may be a	bug in that file.  The rest of the files could
       still be	executed without problem, allowing the user to continue.

       SIGTERM and SIGQUIT cause bc(1) to clean	up and exit, and it  uses  the
       default handler for all other signals.  The one exception is SIGHUP; in
       that  case,  and	 only  when  bc(1)  is	in  TTY	mode (see the TTY MODE
       section), a SIGHUP will cause bc(1) to clean up and exit.

COMMAND	LINE HISTORY
       bc(1) supports interactive command-line editing.

       If bc(1)	can be in TTY mode (see	the TTY	MODE section), history can  be
       enabled.	 This means that command-line history can only be enabled when
       stdin, stdout, and stderr are all connected to a	TTY.

       Like  TTY  mode itself, it can be turned	on or off with the environment
       variable	BC_TTY_MODE (see the ENVIRONMENT VARIABLES section).

       If history is enabled, previous lines can be recalled and  edited  with
       the arrow keys.

       Note: tabs are converted	to 8 spaces.

LOCALES
       This  bc(1)  ships with support for adding error	messages for different
       locales and thus, supports LC_MESSAGES.

SEE ALSO
       dc(1)

STANDARDS
       bc(1) is	compliant  with	 the  IEEE  Std	 1003.1-2017  ("POSIX.1-2017")
       specification							    at
       https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html    .
       The flags -efghiqsvVw, all long options,	and the	extensions noted above
       are extensions to that specification.

       In  addition,  the behavior of the quit implements an interpretation of
       that specification that is different from  all  known  implementations.
       For  more  information  see  the	 Statements  subsection	 of the	SYNTAX
       section.

       Note that the specification explicitly says  that  bc(1)	 only  accepts
       numbers that use	a period (.) as	a radix	point, regardless of the value
       of LC_NUMERIC.

       This  bc(1) supports error messages for different locales, and thus, it
       supports	LC_MESSAGES.

BUGS
       Before version 6.1.0, this bc(1)	had incorrect behavior	for  the  quit
       statement.

       No      other	  bugs	    are	    known.	Report	   bugs	    at
       https://git.gavinhoward.com/gavin/bc .

AUTHORS
       Gavin D.	Howard <gavin@gavinhoward.com> and contributors.

Gavin D. Howard			  August 2024				 BC(1)

NAME | SYNOPSIS | DESCRIPTION | OPTIONS | STDIN | STDOUT | STDERR | SYNTAX | FUNCTIONS | LIBRARY | RESET | PERFORMANCE | LIMITS | ENVIRONMENT VARIABLES | EXIT STATUS | INTERACTIVE MODE | TTY MODE | SIGNAL HANDLING | COMMAND LINE HISTORY | LOCALES | SEE ALSO | STANDARDS | BUGS | AUTHORS

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=bc&manpath=FreeBSD+14.2-RELEASE+and+Ports>

home | help