diff options
Diffstat (limited to 'man-pages-posix-2017/man1p/bc.1p')
-rw-r--r-- | man-pages-posix-2017/man1p/bc.1p | 1620 |
1 files changed, 1620 insertions, 0 deletions
diff --git a/man-pages-posix-2017/man1p/bc.1p b/man-pages-posix-2017/man1p/bc.1p new file mode 100644 index 0000000..fa8bf2e --- /dev/null +++ b/man-pages-posix-2017/man1p/bc.1p @@ -0,0 +1,1620 @@ +'\" et +.TH BC "1P" 2017 "IEEE/The Open Group" "POSIX Programmer's Manual" +.\" +.SH PROLOG +This manual page is part of the POSIX Programmer's Manual. +The Linux implementation of this interface may differ (consult +the corresponding Linux manual page for details of Linux behavior), +or the interface may not be implemented on Linux. +.\" +.SH NAME +bc +\(em arbitrary-precision arithmetic language +.SH SYNOPSIS +.LP +.nf +bc \fB[\fR-l\fB] [\fIfile\fR...\fB]\fR +.fi +.SH DESCRIPTION +The +.IR bc +utility shall implement an arbitrary precision calculator. It shall +take input from any files given, then read from the standard input. If +the standard input and standard output to +.IR bc +are attached to a terminal, the invocation of +.IR bc +shall be considered to be +.IR interactive , +causing behavioral constraints described in the following sections. +.SH OPTIONS +The +.IR bc +utility shall conform to the Base Definitions volume of POSIX.1\(hy2017, +.IR "Section 12.2" ", " "Utility Syntax Guidelines". +.P +The following option shall be supported: +.IP "\fB\-l\fP" 10 +(The letter ell.) Define the math functions and initialize +.IR scale +to 20, instead of the default zero; see the EXTENDED DESCRIPTION +section. +.SH OPERANDS +The following operand shall be supported: +.IP "\fIfile\fR" 10 +A pathname of a text file containing +.IR bc +program statements. After all +.IR file s +have been read, +.IR bc +shall read the standard input. +.SH STDIN +See the INPUT FILES section. +.SH "INPUT FILES" +Input files shall be text files containing a sequence of comments, +statements, and function definitions that shall be executed as they are +read. +.SH "ENVIRONMENT VARIABLES" +The following environment variables shall affect the execution of +.IR bc : +.IP "\fILANG\fP" 10 +Provide a default value for the internationalization variables that are +unset or null. (See the Base Definitions volume of POSIX.1\(hy2017, +.IR "Section 8.2" ", " "Internationalization Variables" +for the precedence of internationalization variables used to determine +the values of locale categories.) +.IP "\fILC_ALL\fP" 10 +If set to a non-empty string value, override the values of all the +other internationalization variables. +.IP "\fILC_CTYPE\fP" 10 +Determine the locale for the interpretation of sequences of bytes of +text data as characters (for example, single-byte as opposed to +multi-byte characters in arguments and input files). +.IP "\fILC_MESSAGES\fP" 10 +.br +Determine the locale that should be used to affect the format and +contents of diagnostic messages written to standard error. +.IP "\fINLSPATH\fP" 10 +Determine the location of message catalogs for the processing of +.IR LC_MESSAGES . +.SH "ASYNCHRONOUS EVENTS" +Default. +.SH STDOUT +The output of the +.IR bc +utility shall be controlled by the program read, and consist of zero or +more lines containing the value of all executed expressions without +assignments. The radix and precision of the output shall be controlled +by the values of the +.BR obase +and +.BR scale +variables; see the EXTENDED DESCRIPTION section. +.SH STDERR +The standard error shall be used only for diagnostic messages. +.SH "OUTPUT FILES" +None. +.SH "EXTENDED DESCRIPTION" +.SS "Grammar" +.P +The grammar in this section and the lexical conventions in the +following section shall together describe the syntax for +.IR bc +programs. The general conventions for this style of grammar are +described in +.IR "Section 1.3" ", " "Grammar Conventions". +A valid program can be represented as the non-terminal symbol +.BR program +in the grammar. This formal syntax shall take precedence over the +text syntax description. +.sp +.RS 4 +.nf + +%token EOF NEWLINE STRING LETTER NUMBER +.P +%token MUL_OP +/* \(aq*\(aq, \(aq/\(aq, \(aq%\(aq */ +.P +%token ASSIGN_OP +/* \(aq=\(aq, \(aq+=\(aq, \(aq-=\(aq, \(aq*=\(aq, \(aq/=\(aq, \(aq%=\(aq, \(aq\(ha=\(aq */ +.P +%token REL_OP +/* \(aq==\(aq, \(aq<=\(aq, \(aq>=\(aq, \(aq!=\(aq, \(aq<\(aq, \(aq>\(aq */ +.P +%token INCR_DECR +/* \(aq++\(aq, \(aq--\(aq */ +.P +%token Define Break Quit Length +/* \(aqdefine\(aq, \(aqbreak\(aq, \(aqquit\(aq, \(aqlength\(aq */ +.P +%token Return For If While Sqrt +/* \(aqreturn\(aq, \(aqfor\(aq, \(aqif\(aq, \(aqwhile\(aq, \(aqsqrt\(aq */ +.P +%token Scale Ibase Obase Auto +/* \(aqscale\(aq, \(aqibase\(aq, \(aqobase\(aq, \(aqauto\(aq */ +.P +%start program +.P +%% +.P +program : EOF + | input_item program + ; +.P +input_item : semicolon_list NEWLINE + | function + ; +.P +semicolon_list : /* empty */ + | statement + | semicolon_list \(aq;\(aq statement + | semicolon_list \(aq;\(aq + ; +.P +statement_list : /* empty */ + | statement + | statement_list NEWLINE + | statement_list NEWLINE statement + | statement_list \(aq;\(aq + | statement_list \(aq;\(aq statement + ; +.P +statement : expression + | STRING + | Break + | Quit + | Return + | Return \(aq(\(aq return_expression \(aq)\(aq + | For \(aq(\(aq expression \(aq;\(aq + relational_expression \(aq;\(aq + expression \(aq)\(aq statement + | If \(aq(\(aq relational_expression \(aq)\(aq statement + | While \(aq(\(aq relational_expression \(aq)\(aq statement + | \(aq{\(aq statement_list \(aq}\(aq + ; +.P +function : Define LETTER \(aq(\(aq opt_parameter_list \(aq)\(aq + \(aq{\(aq NEWLINE opt_auto_define_list + statement_list \(aq}\(aq + ; +.P +opt_parameter_list : /* empty */ + | parameter_list + ; +.P +parameter_list : LETTER + | define_list \(aq,\(aq LETTER + ; +.P +opt_auto_define_list : /* empty */ + | Auto define_list NEWLINE + | Auto define_list \(aq;\(aq + ; +.P +define_list : LETTER + | LETTER \(aq[\(aq \(aq]\(aq + | define_list \(aq,\(aq LETTER + | define_list \(aq,\(aq LETTER \(aq[\(aq \(aq]\(aq + ; +.P +opt_argument_list : /* empty */ + | argument_list + ; +.P +argument_list : expression + | LETTER \(aq[\(aq \(aq]\(aq \(aq,\(aq argument_list + ; +.P +relational_expression : expression + | expression REL_OP expression + ; +.P +return_expression : /* empty */ + | expression + ; +.P +expression : named_expression + | NUMBER + | \(aq(\(aq expression \(aq)\(aq + | LETTER \(aq(\(aq opt_argument_list \(aq)\(aq + | \(aq-\(aq expression + | expression \(aq+\(aq expression + | expression \(aq-\(aq expression + | expression MUL_OP expression + | expression \(aq^\(aq expression + | INCR_DECR named_expression + | named_expression INCR_DECR + | named_expression ASSIGN_OP expression + | Length \(aq(\(aq expression \(aq)\(aq + | Sqrt \(aq(\(aq expression \(aq)\(aq + | Scale \(aq(\(aq expression \(aq)\(aq + ; +.P +named_expression : LETTER + | LETTER \(aq[\(aq expression \(aq]\(aq + | Scale + | Ibase + | Obase + ; +.fi +.P +.RE +.SS "Lexical Conventions in bc" +.P +The lexical conventions for +.IR bc +programs, with respect to the preceding grammar, shall be as follows: +.IP " 1." 4 +Except as noted, +.IR bc +shall recognize the longest possible token or delimiter beginning at a +given point. +.IP " 2." 4 +A comment shall consist of any characters beginning with the two adjacent +characters +.BR \(dq/*\(dq +and terminated by the next occurrence of the two adjacent characters +.BR \(dq*/\(dq . +Comments shall have no effect except to delimit lexical tokens. +.IP " 3." 4 +The +<newline> +shall be recognized as the token +.BR NEWLINE . +.IP " 4." 4 +The token +.BR STRING +shall represent a string constant; it shall consist of any characters +beginning with the double-quote character (\c +.BR '\&"' ) +and terminated by another occurrence of the double-quote character. The +value of the string is the sequence of all characters between, but not +including, the two double-quote characters. All characters shall be +taken literally from the input, and there is no way to specify a string +containing a double-quote character. The length of the value of each +string shall be limited to +{BC_STRING_MAX} +bytes. +.IP " 5." 4 +A +<blank> +shall have no effect except as an ordinary character if it appears +within a +.BR STRING +token, or to delimit a lexical token other than +.BR STRING . +.IP " 6." 4 +The combination of a +<backslash> +character immediately followed by a +<newline> +shall have no effect other than to delimit lexical tokens with the +following exceptions: +.RS 4 +.IP " *" 4 +It shall be interpreted as the character sequence +.BR \(dq\e<newline>\(dq +in +.BR STRING +tokens. +.IP " *" 4 +It shall be ignored as part of a multi-line +.BR NUMBER +token. +.RE +.IP " 7." 4 +The token +.BR NUMBER +shall represent a numeric constant. It shall be recognized by the +following grammar: +.RS 4 +.sp +.RS 4 +.nf + +NUMBER : integer + | \(aq.\(aq integer + | integer \(aq.\(aq + | integer \(aq.\(aq integer + ; +.P +integer : digit + | integer digit + ; +.P +digit : 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 + | 8 | 9 | A | B | C | D | E | F + ; +.fi +.P +.RE +.RE +.IP " 8." 4 +The value of a +.BR NUMBER +token shall be interpreted as a numeral in the base specified by the +value of the internal register +.BR ibase +(described below). Each of the +.BR digit +characters shall have the value from 0 to 15 in the order listed here, +and the +<period> +character shall represent the radix point. The behavior is undefined if +digits greater than or equal to the value of +.BR ibase +appear in the token. However, note the exception for single-digit +values being assigned to +.BR ibase +and +.BR obase +themselves, in +.IR "Operations in bc". +.IP " 9." 4 +The following keywords shall be recognized as tokens: +.TS +tab(@); +lBw(0.6i)e lBe lBe lBe lBe. +T{ +.nf +auto +break +define +T}@T{ +.nf +ibase +if +for +T}@T{ +.nf +length +obase +quit +T}@T{ +.nf +return +scale +sqrt +T}@T{ +.nf +while +.fi +T} +.TE +.IP 10. 4 +Any of the following characters occurring anywhere except within a +keyword shall be recognized as the token +.BR LETTER : +.RS 4 +.sp +.RS 4 +.nf + +a b c d e f g h i j k l m n o p q r s t u v w x y z +.fi +.P +.RE +.RE +.IP 11. 4 +The following single-character and two-character sequences shall be +recognized as the token +.BR ASSIGN_OP : +.RS 4 +.sp +.RS 4 +.nf + += += -= *= /= %= \(ha= +.fi +.P +.RE +.RE +.IP 12. 4 +If an +.BR '=' +character, as the beginning of a token, is followed by a +.BR '\-' +character with no intervening delimiter, the behavior is undefined. +.IP 13. 4 +The following single-characters shall be recognized as the token +.BR MUL_OP : +.RS 4 +.sp +.RS 4 +.nf + +* / % +.fi +.P +.RE +.RE +.IP 14. 4 +The following single-character and two-character sequences shall be +recognized as the token +.BR REL_OP : +.RS 4 +.sp +.RS 4 +.nf + +== <= >= != < > +.fi +.P +.RE +.RE +.IP 15. 4 +The following two-character sequences shall be recognized as the token +.BR INCR_DECR : +.RS 4 +.sp +.RS 4 +.nf + +++ -- +.fi +.P +.RE +.RE +.IP 16. 4 +The following single characters shall be recognized as tokens whose +names are the character: +.RS 4 +.sp +.RS 4 +.nf + +<newline> ( ) , + - ; [ ] \(ha { } +.fi +.P +.RE +.RE +.IP 17. 4 +The token +.BR EOF +is returned when the end of input is reached. +.SS "Operations in bc" +.P +There are three kinds of identifiers: ordinary identifiers, array +identifiers, and function identifiers. +All three types consist of single lowercase letters. Array identifiers +shall be followed by square brackets (\c +.BR \(dq[]\(dq ). +An array subscript is required except in an argument or auto list. +Arrays are singly dimensioned and can contain up to +{BC_DIM_MAX} +elements. Indexing shall begin at zero so an array is indexed from 0 to +{BC_DIM_MAX}\-1. +Subscripts shall be truncated to integers. The application shall ensure +that function identifiers are followed by parentheses, possibly +enclosing arguments. The three types of identifiers do not conflict. +.P +The following table summarizes the rules for precedence and +associativity of all operators. Operators on the same line shall have +the same precedence; rows are in order of decreasing precedence. +.sp +.ce 1 +\fBTable: Operators in \fIbc\fP\fR +.TS +center tab(@) box; +cB | cB +lf5 | l. +Operator@Associativity +_ +++, \-\|\-@N/A +unary \-@N/A +\&^@Right to left +*, /, %@Left to right ++, binary \-@Left to right +=, +=, \-=, *=, /=, %=, ^=@Right to left +==, <=, >=, !=, <, >@None +.TE +.P +Each expression or named expression has a +.IR scale , +which is the number of decimal digits that shall be maintained as the +fractional portion of the expression. +.P +.IR "Named expressions" +are places where values are stored. Named expressions shall be valid on +the left side of an assignment. The value of a named expression shall +be the value stored in the place named. Simple identifiers and array +elements are named expressions; they have an initial value of zero and +an initial scale of zero. +.P +The internal registers +.BR scale , +.BR ibase , +and +.BR obase +are all named expressions. The scale of an expression consisting of the +name of one of these registers shall be zero; values assigned to any of +these registers are truncated to integers. The +.BR scale +register shall contain a global value used in computing the scale of +expressions (as described below). The value of the register +.BR scale +is limited to 0 \(<= +.BR scale +\(<= +{BC_SCALE_MAX} +and shall have a default value of zero. The +.BR ibase +and +.BR obase +registers are the input and output number radix, respectively. The +value of +.BR ibase +shall be limited to: +.sp +.RS 4 +.nf + +2 \(<= ibase \(<= 16 +.fi +.P +.RE +.P +The value of +.BR obase +shall be limited to: +.sp +.RS 4 +.nf + +2 \(<= obase \(<= {BC_BASE_MAX} +.fi +.P +.RE +.P +When either +.BR ibase +or +.BR obase +is assigned a single +.BR digit +value from the list in +.IR "Lexical Conventions in bc", +the value shall be assumed in hexadecimal. (For example, +.BR ibase =A +sets to base ten, regardless of the current +.BR ibase +value.) Otherwise, the behavior is undefined when digits greater than +or equal to the value of +.BR ibase +appear in the input. Both +.BR ibase +and +.BR obase +shall have initial values of 10. +.P +Internal computations shall be conducted as if in decimal, regardless +of the input and output bases, to the specified number of decimal +digits. When an exact result is not achieved (for example, +.BR scale "=0;\ 3.2/1)", +the result shall be truncated. +.P +For all values of +.BR obase +specified by this volume of POSIX.1\(hy2017, +.IR bc +shall output numeric values by performing each of the following steps +in order: +.IP " 1." 4 +If the value is less than zero, a +<hyphen-minus> +(\c +.BR '\-' ) +character shall be output. +.IP " 2." 4 +One of the following is output, depending on the numerical value: +.RS 4 +.IP " *" 4 +If the absolute value of the numerical value is greater than or equal +to one, the integer portion of the value shall be output as a series of +digits appropriate to +.BR obase +(as described below), most significant digit first. The most significant +non-zero digit shall be output next, followed by each successively +less significant digit. +.IP " *" 4 +If the absolute value of the numerical value is less than one but +greater than zero and the scale of the numerical value is greater than +zero, it is unspecified whether the character 0 is output. +.IP " *" 4 +If the numerical value is zero, the character 0 shall be output. +.RE +.IP " 3." 4 +If the scale of the value is greater than zero and the numeric value +is not zero, a +<period> +character shall be output, followed by a series of digits appropriate to +.BR obase +(as described below) representing the most significant portion of the +fractional part of the value. If +.IR s +represents the scale of the value being output, the number of digits +output shall be +.IR s +if +.BR obase +is 10, less than or equal to +.IR s +if +.BR obase +is greater than 10, or greater than or equal to +.IR s +if +.BR obase +is less than 10. For +.BR obase +values other than 10, this should be the number of digits needed to +represent a precision of 10\u\s-3\fIs\fP\s+3\d. +.P +For +.BR obase +values from 2 to 16, valid digits are the first +.BR obase +of the single characters: +.sp +.RS 4 +.nf + +0 1 2 3 4 5 6 7 8 9 A B C D E F +.fi +.P +.RE +.P +which represent the values zero to 15, inclusive, respectively. +.P +For bases greater than 16, each digit shall be written as a separate +multi-digit decimal number. Each digit except the most significant +fractional digit shall be preceded by a single +<space>. +For bases from 17 to 100, +.IR bc +shall write two-digit decimal numbers; for bases from 101 to 1\|000, +three-digit decimal strings, and so on. For example, the decimal number +1\|024 in base 25 would be written as: +.sp +.RS 4 +.nf + + 01 15 24 +.fi +.P +.RE +.P +and in base 125, as: +.sp +.RS 4 +.nf + + 008 024 +.fi +.P +.RE +.P +Very large numbers shall be split across lines with 70 characters per +line in the POSIX locale; other locales may split at different +character boundaries. Lines that are continued shall end with a +<backslash>. +.P +A function call shall consist of a function name followed by +parentheses containing a +<comma>-separated +list of expressions, which are the function arguments. A whole array +passed as an argument shall be specified by the array name followed +by empty square brackets. All function arguments shall be passed by +value. As a result, changes made to the formal parameters shall have no +effect on the actual arguments. If the function terminates by executing a +.BR return +statement, the value of the function shall be the value of the +expression in the parentheses of the +.BR return +statement or shall be zero if no expression is provided or if there is +no +.BR return +statement. +.P +The result of +.BR sqrt (\c +.IR expression ) +shall be the square root of the expression. The result shall be +truncated in the least significant decimal place. The scale of the +result shall be the scale of the expression or the value of +.BR scale , +whichever is larger. +.P +The result of +.BR length (\c +.IR expression ) +shall be the total number of significant decimal digits in the +expression. The scale of the result shall be zero. +.P +The result of +.BR scale (\c +.IR expression ) +shall be the scale of the expression. The scale of the result shall be +zero. +.P +A numeric constant shall be an expression. The scale shall be the +number of digits that follow the radix point in the input representing +the constant, or zero if no radix point appears. +.P +The sequence (\ \fIexpression\fP\ ) shall be an expression with the +same value and scale as +.IR expression . +The parentheses can be used to alter the normal precedence. +.P +The semantics of the unary and binary operators are as follows: +.IP "\-\fIexpression\fP" 6 +.br +The result shall be the negative of the +.IR expression . +The scale of the result shall be the scale of +.IR expression . +.P +The unary increment and decrement operators shall not modify the scale +of the named expression upon which they operate. The scale of the +result shall be the scale of that named expression. +.IP "++\fInamed-expression\fP" 6 +.br +The named expression shall be incremented by one. The result shall be +the value of the named expression after incrementing. +.IP "\-\|\-\fInamed-expression\fP" 6 +.br +The named expression shall be decremented by one. The result shall be +the value of the named expression after decrementing. +.IP "\fInamed-expression\fP++" 6 +.br +The named expression shall be incremented by one. The result shall be +the value of the named expression before incrementing. +.IP "\fInamed-expression\fP\-\|\-" 6 +.br +The named expression shall be decremented by one. The result shall be +the value of the named expression before decrementing. +.P +The exponentiation operator, +<circumflex> +(\c +.BR '\(ha' ), +shall bind right to left. +.IP "\fIexpression\fP^\fIexpression\fP" 6 +.br +The result shall be the first +.IR expression +raised to the power of the second +.IR expression . +If the second expression is not an integer, the behavior is undefined. +If +.IR a +is the scale of the left expression and +.IR b +is the absolute value of the right expression, the scale of the result +shall be: +.RS 6 +.sp +.RS 4 +.nf + +if b >= 0 min(a * b, max(scale, a)) if b < 0 scale +.fi +.P +.RE +.RE +The multiplicative operators (\c +.BR '*' , +.BR '/' , +.BR '%' ) +shall bind left to right. +.IP "\fIexpression\fP*\fIexpression\fP" 6 +.br +The result shall be the product of the two expressions. If +.IR a +and +.IR b +are the scales of the two expressions, then the scale of the result +shall be: +.RS 6 +.sp +.RS 4 +.nf + +min(a+b,max(scale,a,b)) +.fi +.P +.RE +.RE +.IP "\fIexpression\fP/\fIexpression\fP" 6 +.br +The result shall be the quotient of the two expressions. The scale of the +result shall be the value of +.BR scale . +.IP "\fIexpression\fP%\fIexpression\fP" 6 +.br +For expressions +.IR a +and +.IR b , +.IR a %\c +.IR b +shall be evaluated equivalent to the steps: +.RS 6 +.IP " 1." 4 +Compute +.IR a /\c +.IR b +to current scale. +.IP " 2." 4 +Use the result to compute: +.RS 4 +.sp +.RS 4 +.nf + +a - (a / b) * b +.fi +.P +.RE +.P +to scale: +.sp +.RS 4 +.nf + +max(scale + scale(b), scale(a)) +.fi +.P +.RE +.RE +The scale of the result shall be: +.sp +.RS 4 +.nf + +max(scale + scale(b), scale(a)) +.fi +.P +.RE +.P +When +.BR scale +is zero, the +.BR '%' +operator is the mathematical remainder operator. +.RE +.P +The additive operators (\c +.BR '\(pl' , +.BR '\-' ) +shall bind left to right. +.IP "\fIexpression\fP+\fIexpression\fP" 6 +.br +The result shall be the sum of the two expressions. The scale of the +result shall be the maximum of the scales of the expressions. +.IP "\fIexpression\fP\-\fIexpression\fP" 6 +.br +The result shall be the difference of the two expressions. The scale of +the result shall be the maximum of the scales of the expressions. +.P +The assignment operators (\c +.BR '=' , +.BR \(dq+=\(dq , +.BR \(dq-=\(dq , +.BR \(dq*=\(dq , +.BR \(dq/=\(dq , +.BR \(dq%=\(dq , +.BR \(dq\(ha=\(dq ) +shall bind right to left. +.IP "\fInamed-expression\fP=\fIexpression\fP" 6 +.br +This expression shall result in assigning the value of the expression +on the right to the named expression on the left. The scale of both the +named expression and the result shall be the scale of +.IR expression . +.P +The compound assignment forms: +.sp +.RS 4 +.nf + +\fInamed-expression\fR <\fIoperator\fR>= \fIexpression\fR +.fi +.P +.RE +.P +shall be equivalent to: +.sp +.RS 4 +.nf + +\fInamed-expression\fR=\fInamed-expression\fR <\fIoperator\fR> \fIexpression\fR +.fi +.P +.RE +.P +except that the +.IR named-expression +shall be evaluated only once. +.P +Unlike all other operators, the relational operators (\c +.BR '<' , +.BR '>' , +.BR \(dq<=\(dq , +.BR \(dq>=\(dq , +.BR \(dq==\(dq , +.BR \(dq!=\(dq ) +shall be only valid as the object of an +.BR if , +.BR while , +or inside a +.BR for +statement. +.IP "\fIexpression1\fP<\fIexpression2\fR" 6 +.br +The relation shall be true if the value of +.IR expression1 +is strictly less than the value of +.IR expression2 . +.IP "\fIexpression1\fP>\fIexpression2\fP" 6 +.br +The relation shall be true if the value of +.IR expression1 +is strictly greater than the value of +.IR expression2 . +.IP "\fIexpression1\fP<=\fIexpression2\fR" 6 +.br +The relation shall be true if the value of +.IR expression1 +is less than or equal to the value of +.IR expression2 . +.IP "\fIexpression1\fP>=\fIexpression2\fR" 6 +.br +The relation shall be true if the value of +.IR expression1 +is greater than or equal to the value of +.IR expression2 . +.IP "\fIexpression1\fP=\|=\fIexpression2\fR" 6 +.br +The relation shall be true if the values of +.IR expression1 +and +.IR expression2 +are equal. +.IP "\fIexpression1\fP!=\fIexpression2\fR" 6 +.br +The relation shall be true if the values of +.IR expression1 +and +.IR expression2 +are unequal. +.P +There are only two storage classes in +.IR bc : +global and automatic (local). +Only identifiers that are local to a function need be declared +with the +.BR auto +command. The arguments to a function shall be local to the function. +All other identifiers are assumed to be global and available to all +functions. All identifiers, global and local, have initial values of +zero. Identifiers declared as auto shall be allocated on entry to the +function and released on returning from the function. They therefore do +not retain values between function calls. Auto arrays shall be +specified by the array name followed by empty square brackets. On entry +to a function, the old values of the names that appear as parameters +and as automatic variables shall be pushed onto a stack. Until the +function returns, reference to these names shall refer only to the new +values. +.P +References to any of these names from other functions that are called +from this function also refer to the new value until one of those +functions uses the same name for a local variable. +.P +When a statement is an expression, unless the main operator is an +assignment, execution of the statement shall write the value of the +expression followed by a +<newline>. +.P +When a statement is a string, execution of the statement shall write +the value of the string. +.P +Statements separated by +<semicolon> +or +<newline> +characters shall be executed sequentially. In an interactive invocation of +.IR bc , +each time a +<newline> +is read that satisfies the grammatical production: +.sp +.RS 4 +.nf + +input_item : semicolon_list NEWLINE +.fi +.P +.RE +.P +the sequential list of statements making up the +.BR semicolon_list +shall be executed immediately and any output produced by that execution +shall be written without any delay due to buffering. +.P +In an +.BR if +statement (\c +.BR if (\c +.IR relation ) +.IR statement ), +the +.IR statement +shall be executed if the relation is true. +.P +The +.BR while +statement (\c +.BR while (\c +.IR relation ) +.IR statement ) +implements a loop in which the +.IR relation +is tested; each time the +.IR relation +is true, the +.IR statement +shall be executed and the +.IR relation +retested. When the +.IR relation +is false, execution shall resume after +.IR statement . +.P +A +.BR for +statement(\c +.BR for (\c +.IR expression ; +.IR relation ; +.IR expression ) +.IR statement ) +shall be the same as: +.sp +.RS 4 +.nf + +\fIfirst-expression\fP +while (\fIrelation\fP) { + \fIstatement\fP + \fIlast-expression\fR +} +.fi +.P +.RE +The application shall ensure that all three expressions are present. +.P +The +.BR break +statement shall cause termination of a +.BR for +or +.BR while +statement. +.P +The +.BR auto +statement (\c +.BR auto +.IR identifier +.BR [ ,\c +.IR identifier \c +.BR ] +\&.\|.\|.) shall cause the values of the identifiers to be pushed down. +The identifiers can be ordinary identifiers or array identifiers. Array +identifiers shall be specified by following the array name by empty +square brackets. The application shall ensure that the +.BR auto +statement is the first statement in a function definition. +.P +A +.BR define +statement: +.sp +.RS 4 +.nf + +define \fILETTER\fP ( \fIopt_parameter_list\fP ) { + \fIopt_auto_define_list\fP + \fIstatement_list\fR +} +.fi +.P +.RE +.P +defines a function named +.BR LETTER . +If a function named +.BR LETTER +was previously defined, the +.BR define +statement shall replace the previous definition. The expression: +.sp +.RS 4 +.nf + +LETTER ( \fIopt_argument_list\fR ) +.fi +.P +.RE +.P +shall invoke the function named +.BR LETTER . +The behavior is undefined if the number of arguments in the invocation +does not match the number of parameters in the definition. Functions +shall be defined before they are invoked. A function shall be +considered to be defined within its own body, so recursive calls are +valid. The values of numeric constants within a function shall be +interpreted in the base specified by the value of the +.BR ibase +register when the function is invoked. +.P +The +.BR return +statements (\c +.BR return +and +.BR return (\c +.IR expression )) +shall cause termination of a function, popping of its auto variables, +and specification of the result of the function. The first form shall +be equivalent to +.BR return (0). +The value and scale of the result returned by the function shall be the +value and scale of the expression returned. +.P +The +.BR quit +statement (\c +.BR quit ) +shall stop execution of a +.IR bc +program at the point where the statement occurs in the input, even if +it occurs in a function definition, or in an +.BR if , +.BR for , +or +.BR while +statement. +.P +The following functions shall be defined when the +.BR \-l +option is specified: +.IP "\fBs\fR(\ \fIexpression\fR\ )" 6 +.br +Sine of argument in radians. +.IP "\fBc\fR(\ \fIexpression\fR\ )" 6 +.br +Cosine of argument in radians. +.IP "\fBa\fR(\ \fIexpression\fR\ )" 6 +.br +Arctangent of argument. +.IP "\fBl\fR(\ \fIexpression\fR\ )" 6 +.br +Natural logarithm of argument. +.IP "\fBe\fR(\ \fIexpression\fR\ )" 6 +.br +Exponential function of argument. +.IP "\fBj\fR(\ \fIexpression1\fR,\ \fIexpression2\fR\ )" 6 +.br +Bessel function of +.IR expression2 +of the first kind of integer order +.IR expression1 . +.P +The scale of the result returned by these functions shall be the value +of the +.BR scale +register at the time the function is invoked. The value of the +.BR scale +register after these functions have completed their execution shall be +the same value it had upon invocation. The behavior is undefined if +any of these functions is invoked with an argument outside the domain +of the mathematical function. +.SH "EXIT STATUS" +The following exit values shall be returned: +.IP 0 10 +All input files were processed successfully. +.IP "\fIunspecified\fR" 10 +An error occurred. +.SH "CONSEQUENCES OF ERRORS" +If any +.IR file +operand is specified and the named file cannot be accessed, +.IR bc +shall write a diagnostic message to standard error and terminate +without any further action. +.P +In an interactive invocation of +.IR bc , +the utility should print an error message and recover following any +error in the input. In a non-interactive invocation of +.IR bc , +invalid input causes undefined behavior. +.LP +.IR "The following sections are informative." +.SH "APPLICATION USAGE" +Automatic variables in +.IR bc +do not work in exactly the same way as in either C or PL/1. +.P +For historical reasons, the exit status from +.IR bc +cannot be relied upon to indicate that an error has occurred. +Returning zero after an error is possible. Therefore, +.IR bc +should be used primarily by interactive users (who can react to error +messages) or by application programs that can somehow validate the +answers returned as not including error messages. +.P +The +.IR bc +utility always uses the +<period> +(\c +.BR '.' ) +character to represent a radix point, regardless of any decimal-point +character specified as part of the current locale. In languages like C or +.IR awk , +the +<period> +character is used in program source, so it can be portable and +unambiguous, while the locale-specific character is used in input and +output. Because there is no distinction between source and input in +.IR bc , +this arrangement would not be possible. Using the locale-specific +character in +.IR bc 's +input would introduce ambiguities into the language; consider the +following example in a locale with a +<comma> +as the decimal-point character: +.sp +.RS 4 +.nf + +define f(a,b) { + ... +} +\&... +.P +f(1,2,3) +.fi +.P +.RE +.P +Because of such ambiguities, the +<period> +character is used in input. Having input follow different conventions +from output would be confusing in either pipeline usage or interactive +usage, so the +<period> +is also used in output. +.SH EXAMPLES +In the shell, the following assigns an approximation of the first ten +digits of +.BR '\(*p' +to the variable +.IR x : +.sp +.RS 4 +.nf + +x=$(printf "%s\en" \(aqscale = 10; 104348/33215\(aq | bc) +.fi +.P +.RE +.P +The following +.IR bc +program prints the same approximation of +.BR '\(*p' , +with a label, to standard output: +.sp +.RS 4 +.nf + +scale = 10 +"pi equals " +104348 / 33215 +.fi +.P +.RE +.P +The following defines a function to compute an approximate value of the +exponential function (note that such a function is predefined if the +.BR \-l +option is specified): +.sp +.RS 4 +.nf + +scale = 20 +define e(x){ + auto a, b, c, i, s + a = 1 + b = 1 + s = 1 + for (i = 1; 1 == 1; i++){ + a = a*x + b = b*i + c = a/b + if (c == 0) { + return(s) + } + s = s+c + } +} +.fi +.P +.RE +.P +The following prints approximate values of the exponential function of +the first ten integers: +.sp +.RS 4 +.nf + +for (i = 1; i <= 10; ++i) { + e(i) +} +.fi +.P +.RE +.SH RATIONALE +The +.IR bc +utility is implemented historically as a front-end processor for +.IR dc ; +.IR dc +was not selected to be part of this volume of POSIX.1\(hy2017 because +.IR bc +was thought to have a more intuitive programmatic interface. Current +implementations that implement +.IR bc +using +.IR dc +are expected to be compliant. +.P +The exit status for error conditions has been left unspecified for +several reasons: +.IP " *" 4 +The +.IR bc +utility is used in both interactive and non-interactive situations. +Different exit codes may be appropriate for the two uses. +.IP " *" 4 +It is unclear when a non-zero exit should be given; divide-by-zero, +undefined functions, and syntax errors are all possibilities. +.IP " *" 4 +It is not clear what utility the exit status has. +.IP " *" 4 +In the 4.3 BSD, System V, and Ninth Edition implementations, +.IR bc +works in conjunction with +.IR dc . +The +.IR dc +utility is the parent, +.IR bc +is the child. This was done to cleanly terminate +.IR bc +if +.IR dc +aborted. +.P +The decision to have +.IR bc +exit upon encountering an inaccessible input file is based on the +belief that +.IR bc +.IR file1 +.IR file2 +is used most often when at least +.IR file1 +contains data/function declarations/initializations. Having +.IR bc +continue with prerequisite files missing is probably not useful. There +is no implication in the CONSEQUENCES OF ERRORS section that +.IR bc +must check all its files for accessibility before opening any of them. +.P +There was considerable debate on the appropriateness of the language +accepted by +.IR bc . +Several reviewers preferred to see either a pure subset of the C +language or some changes to make the language more compatible with C. +While the +.IR bc +language has some obvious similarities to C, it has never claimed to be +compatible with any version of C. An interpreter for a subset of C +might be a very worthwhile utility, and it could potentially make +.IR bc +obsolete. However, no such utility is known in historical practice, and +it was not within the scope of this volume of POSIX.1\(hy2017 to define such a language and +utility. If and when they are defined, it may be appropriate to include +them in a future version of this standard. This left the following +alternatives: +.IP " 1." 4 +Exclude any calculator language from this volume of POSIX.1\(hy2017. +.RS 4 +.P +The consensus of the standard developers was that a simple programmatic +calculator language is very useful for both applications and +interactive users. The only arguments for excluding any calculator were +that it would become obsolete if and when a C-compatible one emerged, +or that the absence would encourage the development of such a +C-compatible one. These arguments did not sufficiently address the +needs of current application developers. +.RE +.IP " 2." 4 +Standardize the historical +.IR dc , +possibly with minor modifications. +.RS 4 +.P +The consensus of the standard developers was that +.IR dc +is a fundamentally less usable language and that that would be far too +severe a penalty for avoiding the issue of being similar to but +incompatible with C. +.RE +.IP " 3." 4 +Standardize the historical +.IR bc , +possibly with minor modifications. +.RS 4 +.P +This was the approach taken. Most of the proponents of changing the +language would not have been satisfied until most or all of the +incompatibilities with C were resolved. Since most of the changes +considered most desirable would break historical applications and +require significant modification to historical implementations, almost +no modifications were made. The one significant modification that was +made was the replacement of the historical +.IR bc +assignment operators +.BR \(dq=+\(dq , +and so on, with the more modern +.BR \(dq+=\(dq , +and so on. The older versions are considered to be fundamentally flawed +because of the lexical ambiguity in uses like +.IR a =\-1. +.P +In order to permit implementations to deal with backwards-compatibility +as they see fit, the behavior of this one ambiguous construct was made +undefined. (At least three implementations have been known to support +this change already, so the degree of change involved should not be +great.) +.RE +.P +The +.BR '%' +operator is the mathematical remainder operator when +.BR scale +is zero. The behavior of this operator for other values of +.BR scale +is from historical implementations of +.IR bc , +and has been maintained for the sake of historical applications despite +its non-intuitive nature. +.P +Historical implementations permit setting +.BR ibase +and +.BR obase +to a broader range of values. This includes values less than 2, which +were not seen as sufficiently useful to standardize. These +implementations do not interpret input properly for values of +.BR ibase +that are greater than 16. This is because numeric constants are +recognized syntactically, rather than lexically, as described in +\&this volume of POSIX.1\(hy2017. They are built from lexical tokens of single hexadecimal digits +and +<period> +characters. Since +<blank> +characters between tokens are not visible at the syntactic level, it is +not possible to recognize the multi-digit ``digits'' used in the higher +bases properly. The ability to recognize input in these bases was not +considered useful enough to require modifying these implementations. +Note that the recognition of numeric constants at the syntactic level +is not a problem with conformance to this volume of POSIX.1\(hy2017, as it does not impact the +behavior of conforming applications (and correct +.IR bc +programs). Historical implementations also accept input with all of the +digits +.BR '0' \-\c +.BR '9' +and +.BR 'A' \-\c +.BR 'F' +regardless of the value of +.BR ibase ; +since digits with value greater than or equal to +.BR ibase +are not really appropriate, the behavior when they appear is undefined, +except for the common case of: +.sp +.RS 4 +.nf + +ibase=8; + /* Process in octal base. */ +\&... +ibase=A + /* Restore decimal base. */ +.fi +.P +.RE +.P +In some historical implementations, if the expression to be written is +an uninitialized array element, a leading +<space> +and/or up to four leading 0 characters may be output before the +character zero. This behavior is considered a bug; it is unlikely that +any currently conforming application relies on: +.sp +.RS 4 +.nf + +echo \(aqb[3]\(aq | bc +.fi +.P +.RE +.P +returning 00000 rather than 0. +.P +Exact calculation of the number of fractional digits to output for a +given value in a base other than 10 can be computationally expensive. +Historical implementations use a faster approximation, and this is +permitted. Note that the requirements apply only to values of +.BR obase +that this volume of POSIX.1\(hy2017 requires implementations to support (in particular, not to +1, 0, or negative bases, if an implementation supports them as an +extension). +.P +Historical implementations of +.IR bc +did not allow array parameters to be passed as the last parameter to a +function. New implementations are encouraged to remove this restriction +even though it is not required by the grammar. +.SH "FUTURE DIRECTIONS" +None. +.SH "SEE ALSO" +.IR "Section 1.3" ", " "Grammar Conventions", +.IR "\fIawk\fR\^" +.P +The Base Definitions volume of POSIX.1\(hy2017, +.IR "Chapter 8" ", " "Environment Variables", +.IR "Section 12.2" ", " "Utility Syntax Guidelines" +.\" +.SH COPYRIGHT +Portions of this text are reprinted and reproduced in electronic form +from IEEE Std 1003.1-2017, Standard for Information Technology +-- Portable Operating System Interface (POSIX), The Open Group Base +Specifications Issue 7, 2018 Edition, +Copyright (C) 2018 by the Institute of +Electrical and Electronics Engineers, Inc and The Open Group. +In the event of any discrepancy between this version and the original IEEE and +The Open Group Standard, the original IEEE and The Open Group Standard +is the referee document. The original Standard can be obtained online at +http://www.opengroup.org/unix/online.html . +.PP +Any typographical or formatting errors that appear +in this page are most likely +to have been introduced during the conversion of the source files to +man page format. To report such errors, see +https://www.kernel.org/doc/man-pages/reporting_bugs.html . |