bc(1) -- arbitrary-precision arithmetic language and calculator
===============================================================

SYNOPSIS
--------

`bc` [`-ghilPqsvVw`] [`--global-stacks`] [`--help`] [`--interactive`]
[`--mathlib`] [`--no-prompt`] [`--quiet`] [`--standard`] [`--warn`]
[`--version`] [`-e` *expr*] [`--expression=`*expr*...] [`-f` *file*...]
[`-file=`*file*...] [*file*...]

DESCRIPTION
-----------

bc(1) is an interactive processor for a language first standardized in 1991 by
POSIX. (The current standard is [here][1].) 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`.

With all build options, except for extra math, enabled this bc(1) is a drop-in
replacement for ***any*** bc(1), including (and especially) the GNU bc(1). It is
also a drop-in replacement for any bc(1) if extra math is enabled, but it will
have extra features not found in other bc(1) implementations.

OPTIONS
-------

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

  * `-g`, `--global-stacks`:
    Turns the globals `ibase`, `obase`, and `scale` into stacks. This includes
    `seed` if bc(1) was built with the extra math option.

    This has the effect that a copy of the current value of all three 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, `output(x,b)` (in the [extended library](#extended-library)) could
    have been 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.

    However, since using this flag means that functions cannot set `ibase`,
    `obase`, or `scale` 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`, or `scale`
    globally for any other purpose, it could be split into one to three
    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 quits.

  * `-i`, `--interactive`:
    Forces interactive mode.

    Per the [standard][1], bc(1) has an interactive mode and a non-interactive
    mode. The interactive mode is turned on automatically when both `stdin` and
    `stdout` are hooked to a terminal, but this flag can turn it on in other
    cases. 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.

    This is a **non-portable extension**.

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

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

  * `-P`, `--no-prompt`:
    Disables the prompt in interactive mode. This is mostly for those users that
    do not want a prompt or are not used to having them in `bc`. Most of those
    users would want to put this option in `BC_ENV_ARGS`.

    If the prompt has been disabled while building bc(1), this option is a
    no-op.

    This is a **non-portable extension**.

  * `-q`, `--quiet`:
    Do not print copyright header. bc(1) will also suppress the header in
    non-interactive mode.

    This is mostly for compatibility with the [GNU bc(1)][2].

    This is a **non-portable extension**.

  * `-s`, `--standard`:
    Process exactly the language defined by the [standard][1] and error if any
    extensions are used.

    This is a **non-portable extension**.

  * `-v`, `-V`, `--version`:
    Print the version information (copyright header) and exit.

    This is a **non-portable extension**.

  * `-w`, `--warn`:
    Like `-s` and `--standard`, except that warnings (and not errors) are given
    for non-standard extensions.

    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 below), 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.

    In other bc(1) implementations, this option causes the program to execute
    the expressions and then exit. This bc(1) does not, unless the
    `BC_EXPR_EXIT` is defined (see the ENVIRONMENT VARIABLES section).

    This is a **non-portable extension**.

  * `-f` *file*, `--file`=*file*:
    Reads in `file` and evaluates it. If expressions are also given (see above),
    the expressions are evaluated in the order given.

    In other bc(1) implementations, this option causes the program to execute
    the files and then exit. This bc(1) does not, unless the
    `BC_EXPR_EXIT` is defined (see the ENVIRONMENT VARIABLES section).

    This is a **non-portable extension**.

**Note**: long options are only accepted if bc(1) is built with them enabled.

STDOUT
------

Any non-error output is written 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 <file> >&-`, 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 <file> 2>&-`, it will quit with an error. This is
done so that bc(1) can report problems 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][1], 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][1].

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`. The min
allowable value for `obase` is `2`, unless bc(1) was built with the extra math
option. If it was, then the min allowable value is `0`. In this case, if `obase`
is `0`, values are output in scientific notation, and if `obase` is `1`, values
are output in engineering notation. (Outputting in scientific or engineering
notation are **non-portable extensions**.) The max allowable value for `obase`
can be queried in bc(1) programs with the `maxobase()` built in function.

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` 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 FUNCTIONS). 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 **global** variable that
is accessed by a function that it calls, 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](#bc-named-expressions) or [Operands](#bc-operands)) is
printed unless the lowest precedence operator is an
[`assignment`](#bc-assignment) operator ***and*** the expression is not
surrounded 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**.

<a name="bc-named-expressions"/>

### 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.	`last` or a single dot (`.`)

Number 6 is a **non-portable extension**.

If bc(1) was built with the extra math option, the following is also a named
expression:

1.	`seed`

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** 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, except
if the parameter passed to `irand(E)` is `0` or `1`.

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

This command is only available if bc(1) was built with the extra math option.

This is a **non-portable extension**.

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.

Named expressions are required as the operand of
[`increment`/`decrement` operators](#bc-increment-decrement) and as the left
side of [`assignment` operators](#bc-assignment).

<a name="bc-operands"/>

### Operands

The following are valid operands in bc(1):

1.	Numbers (see [Numbers](#bc-numbers) 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`.
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.	`I()`, `I(E)`, `I(E, E)`, and so on, where `I` is an identifier for a
	non-[void function](#void-functions). The `E` parameters may also be arrays
	and [array references](#array-references).
10.	`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**.
11.	`maxibase()`: The max allowable `ibase`. This is a **non-portable
	extension**.
12.	`maxobase()`: The max allowable `obase`. This is a **non-portable
	extension**.
13.	`maxscale()`: The max allowable `scale`. This is a **non-portable
	extension**.

If bc(1) was built with the extra math option, the following are also valid
operands:

1.	`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**.
2.	`irand(E)`: A pseudo-random integer between `0` (inclusive) and the
	value of `E` (exclusive). If `E` is negative or is a non-integer (**scale**
	is not `0`), an error is raised, and bc(1) resets (see the RESET section).
	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`. If `E` is `0` or `1`, then `0` is
	returned, and `seed` is not changed. This is a **non-portable extension**.
3.	`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.

<a name="bc-numbers"/>

### 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
equal `9` + their position in the alphabet (i.e., `A` equals `10`, or `9 + 1`).
If a digit or letter makes no sense with the current value of `ibase`, they are
set to the value of the highest valid digit in `ibase`.

Single-character numbers (i.e., `A`) take the value that they would have if they
were valid digits, regardless of the value of `ibase`. This means that `A`
always equals decimal `10` and `Z` always equals decimal `35`.

In addition, if bc(1) was built with the extra math option, it accepts numbers
in scientific notation. For bc(1), 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.

<a name="bc-increment-decrement"/>

  * `++` `--`:
    The prefix and postfix `increment` and `decrement` operators behave exactly
    like they would in C. They require a [named expression](#named-expressions)
    as an operand.

  * `-`:
    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.

    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**.

    This is only available if bc(1) has been compiled with the extra math option
    enabled.

  * `@`:
    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**.

    This is only available if bc(1) has been compiled with the extra math option
    enabled.

  * `^`:
    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 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 **scale**s 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 **scale**s 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**.

    This is only available if bc(1) has been compiled with the extra math option
    enabled.

  * `>>`:
    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**.

    This is only available if bc(1) has been compiled with the extra math option
    enabled.

<a name="bc-assignment"/>

  * `=` `<<=` `>>=` `+=` `-=` `*=` `/=` `%=` `^=` `@=`:
    The `assignment` operators take two expressions, `a` and `b` where `a` is a
    [named expression](#bc-named-expressions).

    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 extensions.

    Also, those `assignment` operators that are extensions are only available if
    bc(1) has been compiled with the extra math option enabled.

  * `==` `<=` `>=` `!=` `<` `>`:
    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][1] 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.	`I()`, `I(E)`, `I(E, E)`, and so on, where `I` is an identifier for a
	[void function](#void-functions). The `E` parameters may also be arrays and
	[array references](#array-references).

Numbers 4, 9, 11, 12, 14, and 15 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).

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. If
bc(1) has been built with the extra math option enabled, both scientific
notation and engineering notation are available for printing the results of
expressions. Scientific notation is activated by assigning `0` to `obase` (in
any other context, an `obase` of `0` is invalid), and engineering notation is
activated by assigning `1` to `obase` (which is also invalid in any other
context). 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**.

### 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.

### 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, that in the expression
`i = 0; 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, this means that in the expression
`i = 0; 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.

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

The return statement may also be in 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](#void-functions).

<a name="void-functions"/>

### 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**.

<a name="array-references"/>

### 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 library](#extended-library) if bc(1) has been compiled with the extra
math option enabled, are available when the `-l` or `--mathlib` command-line
flags are given.

<a name="standard-library"/>

### Standard Library

The [standard][1] 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][5].

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

    This is a [transcendental function][5].

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

    This is a [transcendental function][5].

  * `l(x)`:
    Returns the natural logarithm of `x`.

    This is a [transcendental function][5].

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

    This is a [transcendental function][5].

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

    This is a [transcendental function][5].

<a name="extended-library"/>

### Extended Library

In addition to the [standard library](#standard-library), if bc(1) has been
built with the extra math option, the following functions are available when
either the `-l` or `--mathlib` options are given.

However, 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][1].

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`.

    This is a [transcendental function][5].

  * `r(x, p)`:
    Returns `x` rounded to `p` decimal places according to the rounding mode
    [round half away from `0`][3].

  * `ceil(x, p)`:
    Returns `x` rounded to `p` decimal places according to the rounding mode
    [round away from `0`][7].

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

  * `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`.

  * `l2(x)`:
    Returns the logarithm base `2` of `x`.

    This is a [transcendental function][5].

  * `l10(x)`:
    Returns the logarithm base `10` of `x`.

    This is a [transcendental function][5].

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

    This is a [transcendental function][5].

  * `cbrt(x)`:
    Returns the cube root of `x`.

  * `root(x, n)`:
    Calculates the truncated value of `n`, `r`, and returns the `r`th 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.

  * `pi(p)`:
    Returns `pi` to `p` decimal places.

    This is a [transcendental function][5].

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

    This is a [transcendental function][5].

  * `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][5].

  * `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][5].

  * `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][5].

  * `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][5].

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

    This is an alias of `a(x)`.

    This is a [transcendental function][5].

  * `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][5].

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

    This is a [transcendental function][5].

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

    This is a [transcendental function][5].

  * `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.

  * `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`).

  * `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`.

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

    This is a [void function](#void-functions).

  * `binary(x)`:
    Outputs the binary (base `2`) representation of `x`.

    This is a [void function](#void-functions).

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

    This is a [void function](#void-functions).

  * `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](#void-functions).

  * `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](#void-functions).

  * `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](#void-functions).

  * `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](#void-functions).

  * `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](#void-functions).

  * `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](#void-functions).

  * `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](#void-functions).

  * `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](#void-functions).

  * `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](#void-functions).

  * `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](#void-functions).

  * `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](#void-functions).

  * `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](#void-functions).

  * `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](#void-functions).

  * `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](#void-functions).

  * `output_uint(x, n)`:
    Outputs the representation of the truncated absolute value of `x` as an
    unsigned integer in the current [`obase`](#obase) using `n` bytes. Not all
    of the value will be output if `n` is too small.

    This is a [void function](#void-functions).

  * `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](#void-functions).

<a name="transcendental-functions"/>

### Transcendental Functions

All transcendental functions can return slightly inaccurate results (up to 1
[ULP][4]). This is unavoidable, and [this article][6] 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`.

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, if bc(1)
    has been built with the extra math option. 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`.

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
---------------------

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 `DC_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`.

  * `BC_EXPR_EXIT`:
    If this variable exists (no matter the contents), bc(1) will exit
    immediately after executing expressions and files given by the `-e` and/or
    `-f` command-line options (and any equivalents).

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, 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](#bc-named-expressions), 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 `ibase`, `obase`, or
    `scale`; give a bad expression to a `read()` call, calling `read()` inside
    of a `read()` call, type errors, passing the wrong number of parameters 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,
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` 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 `-i`.

SIGNAL HANDLING
---------------

If bc(1) has been compiled with the signal handling, sending a `SIGINT` will
cause bc(1) to stop execution of the current input and reset (see the RESET
section), asking for more input.

Otherwise, `SIGTERM` and `SIGQUIT` cause bc(1) to clean up and exit, and it uses
the default handler for all other signals.

If bc(1) has not been compiled with signal handling, it uses the default signal
handlers for all signals.

COMMAND LINE HISTORY
--------------------

bc(1) supports interactive command-line editing, if compiled with the history
option enabled. If `stdin` is hooked to a terminal, it is enabled. Previous
lines can be recalled and edited with the arrow keys.

**Note**: when bc(1) is built with history support, tabs are converted to 8
spaces.

LOCALES
-------

This bc(1) ships with support for adding error messages for different locales.

SEE ALSO
--------

dc(1)

STANDARDS
---------

bc(1) is compliant with the [IEEE Std 1003.1-2017 (“POSIX.1-2017”)][1]
specification. The flags `-efghiqsvVw`, all long options, and the extensions
noted above are extensions to that specification.

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) ships with support for adding error messages for different locales,
so it supports `LC_MESSAGES`.

AUTHOR
------

This bc(1) was made from scratch by Gavin D. Howard.

BUGS
----

None are known. Report bugs at https://git.yzena.com/gavin/bc.

[1]: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html
[2]: https://www.gnu.org/software/bc/
[3]: https://en.wikipedia.org/wiki/Rounding#Round_half_away_from_zero
[4]: https://en.wikipedia.org/wiki/Unit_in_the_last_place
[5]: #transcendental-functions
[6]: https://people.eecs.berkeley.edu/~wkahan/LOG10HAF.TXT
[7]: https://en.wikipedia.org/wiki/Rounding#Rounding_away_from_zero
