fatbase

portable OpenBSD tools
git clone git://git.2f30.org/fatbase
Log | Files | Refs

bc.1 (10586B)


      1 .\"	$OpenBSD: bc.1,v 1.30 2014/01/14 07:42:42 jmc Exp $
      2 .\"
      3 .\" Copyright (C) Caldera International Inc.  2001-2002.
      4 .\" All rights reserved.
      5 .\"
      6 .\" Redistribution and use in source and binary forms, with or without
      7 .\" modification, are permitted provided that the following conditions
      8 .\" are met:
      9 .\" 1. Redistributions of source code and documentation must retain the above
     10 .\"    copyright notice, this list of conditions and the following disclaimer.
     11 .\" 2. Redistributions in binary form must reproduce the above copyright
     12 .\"    notice, this list of conditions and the following disclaimer in the
     13 .\"    documentation and/or other materials provided with the distribution.
     14 .\" 3. All advertising materials mentioning features or use of this software
     15 .\"    must display the following acknowledgement:
     16 .\"	This product includes software developed or owned by Caldera
     17 .\"	International, Inc.
     18 .\" 4. Neither the name of Caldera International, Inc. nor the names of other
     19 .\"    contributors may be used to endorse or promote products derived from
     20 .\"    this software without specific prior written permission.
     21 .\"
     22 .\" USE OF THE SOFTWARE PROVIDED FOR UNDER THIS LICENSE BY CALDERA
     23 .\" INTERNATIONAL, INC. AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR
     24 .\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     25 .\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     26 .\" IN NO EVENT SHALL CALDERA INTERNATIONAL, INC. BE LIABLE FOR ANY DIRECT,
     27 .\" INDIRECT INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     28 .\" (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
     29 .\" SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     30 .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     31 .\" STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     32 .\" IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     33 .\" POSSIBILITY OF SUCH DAMAGE.
     34 .\"
     35 .\"	@(#)bc.1	6.8 (Berkeley) 8/8/91
     36 .\"
     37 .Dd $Mdocdate: January 14 2014 $
     38 .Dt BC 1
     39 .Os
     40 .Sh NAME
     41 .Nm bc
     42 .Nd arbitrary-precision arithmetic language and calculator
     43 .Sh SYNOPSIS
     44 .Nm bc
     45 .Op Fl cl
     46 .Op Fl e Ar expression
     47 .Op Ar file ...
     48 .Sh DESCRIPTION
     49 .Nm
     50 is an interactive processor for a language which resembles
     51 C but provides unlimited precision arithmetic.
     52 It takes input from any expressions on the command line and
     53 any files given, then reads the standard input.
     54 .Pp
     55 Options available:
     56 .Bl -tag -width Ds
     57 .It Fl c
     58 .Nm
     59 is actually a preprocessor for
     60 .Xr dc 1 ,
     61 which it invokes automatically, unless the
     62 .Fl c
     63 .Pq compile only
     64 option is present.
     65 In this case the generated
     66 .Xr dc 1
     67 instructions are sent to the standard output,
     68 instead of being interpreted by a running
     69 .Xr dc 1
     70 process.
     71 .It Fl e Ar expression
     72 Evaluate
     73 .Ar expression .
     74 If multiple
     75 .Fl e
     76 options are specified, they are processed in the order given,
     77 separated by newlines.
     78 .It Fl l
     79 Allow specification of an arbitrary precision math library.
     80 The definitions in the library are available to command line
     81 expressions.
     82 .El
     83 .Pp
     84 The syntax for
     85 .Nm
     86 programs is as follows:
     87 .Sq L
     88 means letter a-z;
     89 .Sq E
     90 means expression;
     91 .Sq S
     92 means statement.
     93 As a non-portable extension, it is possible to use long names
     94 in addition to single letter names.
     95 A long name is a sequence starting with a lowercase letter
     96 followed by any number of lowercase letters and digits.
     97 The underscore character
     98 .Pq Sq _
     99 counts as a letter.
    100 .Pp
    101 Comments
    102 .Bd -unfilled -offset indent -compact
    103 are enclosed in /* and */
    104 are enclosed in # and the next newline
    105 .Ed
    106 .Pp
    107 The newline is not part of the line comment,
    108 which in itself is a non-portable extension.
    109 .Pp
    110 Names
    111 .Bd -unfilled -offset indent -compact
    112 simple variables: L
    113 array elements: L [ E ]
    114 The words `ibase', `obase', and `scale'
    115 The word `last' or a single dot
    116 .Ed
    117 .Pp
    118 Other operands
    119 .Bd -unfilled -offset indent -compact
    120 arbitrarily long numbers with optional sign and decimal point
    121 ( E )
    122 sqrt ( E )
    123 length ( E )	number of significant decimal digits
    124 scale ( E )	number of digits right of decimal point
    125 L ( E , ... , E )
    126 .Ed
    127 .Pp
    128 The sequence
    129 .Sq \e<newline><whitespace>
    130 is ignored within numbers.
    131 .Pp
    132 Operators
    133 .Pp
    134 The following arithmetic and logical operators can be used.
    135 The semantics of the operators is the same as in the C language.
    136 They are listed in order of decreasing precedence.
    137 Operators in the same group have the same precedence.
    138 .Bl -column "= += \-= *= /= %= ^=" "Associativity" "multiply, divide, modulus" -offset indent
    139 .It Sy "Operator" Ta Sy "Associativity" Ta Sy "Description"
    140 .It "++ \-\-" Ta "none" Ta "increment, decrement"
    141 .It "\-" Ta "none" Ta "unary minus"
    142 .It "^" Ta "right" Ta "power"
    143 .It "* / %" Ta "left" Ta "multiply, divide, modulus"
    144 .It "+ \-" Ta "left" Ta "plus, minus"
    145 .It "= += -= *= /= %= ^=" Ta "right" Ta "assignment"
    146 .It "== <= >= != < >" Ta "none" Ta "relational"
    147 .It "!" Ta "none" Ta "boolean not"
    148 .It "&&" Ta "left" Ta "boolean and"
    149 .It "||" Ta "left" Ta "boolean or"
    150 .El
    151 .Pp
    152 Note the following:
    153 .Bl -bullet -offset indent
    154 .It
    155 The relational operators may appear in any expression.
    156 The
    157 .St -p1003.1-2008
    158 standard only allows them in the conditional expression of an
    159 .Sq if ,
    160 .Sq while
    161 or
    162 .Sq for
    163 statement.
    164 .It
    165 The relational operators have a lower precedence than the assignment
    166 operators.
    167 This has the consequence that the expression
    168 .Sy a = b < c
    169 is interpreted as
    170 .Sy (a = b) < c ,
    171 which is probably not what the programmer intended.
    172 .It
    173 In contrast with the C language, the relational operators all have
    174 the same precedence, and are non-associative.
    175 The expression
    176 .Sy a < b < c
    177 will produce a syntax error.
    178 .It
    179 The boolean operators (!, && and ||) are non-portable extensions.
    180 .It
    181 The boolean not
    182 (!) operator has much lower precedence than the same operator in the
    183 C language.
    184 This has the consequence that the expression
    185 .Sy !a < b
    186 is interpreted as
    187 .Sy !(a < b) .
    188 Prudent programmers use parentheses when writing expressions involving
    189 boolean operators.
    190 .El
    191 .Pp
    192 Statements
    193 .Bd -unfilled -offset indent -compact
    194 E
    195 { S ; ... ; S }
    196 if ( E ) S
    197 if ( E ) S else S
    198 while ( E ) S
    199 for ( E ; E ; E ) S
    200 null statement
    201 break
    202 continue
    203 quit
    204 a string of characters, enclosed in double quotes
    205 print E ,..., E
    206 .Ed
    207 .Pp
    208 A string may contain any character, except double quote.
    209 The if statement with an else branch is a non-portable extension.
    210 All three E's in a for statement may be empty.
    211 This is a non-portable extension.
    212 The continue and print statements are also non-portable extensions.
    213 .Pp
    214 The print statement takes a list of comma-separated expressions.
    215 Each expression in the list is evaluated and the computed
    216 value is printed and assigned to the variable `last'.
    217 No trailing newline is printed.
    218 The expression may also be a string enclosed in double quotes.
    219 Within these strings the following escape sequences may be used:
    220 .Sq \ea
    221 for bell (alert),
    222 .Sq \eb
    223 for backspace,
    224 .Sq \ef
    225 for formfeed,
    226 .Sq \en
    227 for newline,
    228 .Sq \er
    229 for carriage return,
    230 .Sq \et
    231 for tab,
    232 .Sq \eq
    233 for double quote and
    234 .Sq \e\e
    235 for backslash.
    236 Any other character following a backslash will be ignored.
    237 Strings will not be assigned to `last'.
    238 .Pp
    239 Function definitions
    240 .Bd -unfilled -offset indent
    241 define L ( L ,..., L ) {
    242 	auto L, ... , L
    243 	S; ... S
    244 	return ( E )
    245 }
    246 .Ed
    247 .Pp
    248 As a non-portable extension, the opening brace of the define statement
    249 may appear on the next line.
    250 The return statement may also appear in the following forms:
    251 .Bd -unfilled -offset indent
    252 return
    253 return ()
    254 return E
    255 .Ed
    256 .Pp
    257 The first two are equivalent to the statement
    258 .Dq return 0 .
    259 The last form is a non-portable extension.
    260 Not specifying a return statement is equivalent to writing
    261 .Dq return (0) .
    262 .Pp
    263 Functions available in the math library, which is loaded by specifying the
    264 .Fl l
    265 flag on the command line
    266 .Pp
    267 .Bl -tag -width j(n,x) -offset indent -compact
    268 .It s(x)
    269 sine
    270 .It c(x)
    271 cosine
    272 .It e(x)
    273 exponential
    274 .It l(x)
    275 log
    276 .It a(x)
    277 arctangent
    278 .It j(n,x)
    279 Bessel function
    280 .El
    281 .Pp
    282 All function arguments are passed by value.
    283 .Pp
    284 The value of a statement that is an expression is printed
    285 unless the main operator is an assignment.
    286 The value printed is assigned to the special variable `last'.
    287 This is a non-portable extension.
    288 A single dot may be used as a synonym for `last'.
    289 Either semicolons or newlines may separate statements.
    290 Assignment to
    291 .Ar scale
    292 influences the number of digits to be retained on arithmetic
    293 operations in the manner of
    294 .Xr dc 1 .
    295 Assignments to
    296 .Ar ibase
    297 or
    298 .Ar obase
    299 set the input and output number radix respectively.
    300 .Pp
    301 The same letter may be used as an array, a function,
    302 and a simple variable simultaneously.
    303 All variables are global to the program.
    304 `Auto' variables are pushed down during function calls.
    305 When using arrays as function arguments
    306 or defining them as automatic variables,
    307 empty square brackets must follow the array name.
    308 .Pp
    309 For example
    310 .Bd -literal -offset indent
    311 scale = 20
    312 define e(x){
    313 	auto a, b, c, i, s
    314 	a = 1
    315 	b = 1
    316 	s = 1
    317 	for(i=1; 1==1; i++){
    318 		a = a*x
    319 		b = b*i
    320 		c = a/b
    321 		if(c == 0) return(s)
    322 		s = s+c
    323 	}
    324 }
    325 .Ed
    326 .Pp
    327 defines a function to compute an approximate value of
    328 the exponential function and
    329 .Pp
    330 .Dl for(i=1; i<=10; i++) e(i)
    331 .Pp
    332 prints approximate values of the exponential function of
    333 the first ten integers.
    334 .Bd -literal -offset indent
    335 $ bc -l -e 'scale = 500; 2 * a(2^10000)' -e quit
    336 .Ed
    337 .Pp
    338 prints an approximation of pi.
    339 .Sh COMMAND LINE EDITING
    340 .Nm
    341 supports interactive command line editing, via the
    342 .Xr editline 3
    343 library.
    344 It is enabled by default if input is from a tty.
    345 Previous lines can be recalled and edited with the arrow keys,
    346 and other GNU Emacs-style editing keys may be used as well.
    347 .Pp
    348 The
    349 .Xr editline 3
    350 library is configured with a
    351 .Pa .editrc
    352 file \- refer to
    353 .Xr editrc 5
    354 for more information.
    355 .Sh FILES
    356 .Bl -tag -width /usr/share/misc/bc.library -compact
    357 .It Pa /usr/share/misc/bc.library
    358 math library, read when the
    359 .Fl l
    360 option is specified on the command line.
    361 .El
    362 .Sh SEE ALSO
    363 .Xr dc 1
    364 .Sh STANDARDS
    365 The
    366 .Nm
    367 utility is compliant with the
    368 .St -p1003.1-2008
    369 specification.
    370 .Pp
    371 The flags
    372 .Op Fl ce ,
    373 as well as the parts noted above,
    374 are extensions to that specification.
    375 .Sh HISTORY
    376 The
    377 .Nm
    378 command first appeared in
    379 .At v6 .
    380 A complete rewrite of the
    381 .Nm
    382 command first appeared in
    383 .Ox 3.5 .
    384 .Sh AUTHORS
    385 .An -nosplit
    386 The original version of the
    387 .Nm
    388 command was written by
    389 .An Robert Morris
    390 and
    391 .An Lorinda Cherry .
    392 The current version of the
    393 .Nm
    394 utility was written by
    395 .An Otto Moerbeek .
    396 .Sh BUGS
    397 .Ql Quit
    398 is interpreted when read, not when executed.
    399 .Pp
    400 Some non-portable extensions, as found in the GNU version of the
    401 .Nm
    402 utility are not implemented (yet).