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