]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - usr.bin/bc/bc.1
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / usr.bin / bc / bc.1
1 .\"     $FreeBSD$
2 .\"     $OpenBSD: bc.1,v 1.30 2014/01/14 07:42:42 jmc 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 April 16, 2014
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 bc
46 .Op Fl chlv
47 .Op Fl e Ar expression
48 .Op Ar file ...
49 .Sh DESCRIPTION
50 .Nm
51 is an interactive processor for a language which resembles
52 C but provides unlimited precision arithmetic.
53 It takes input from any expressions on the command line and
54 any files given, then reads the standard input.
55 .Pp
56 Options available:
57 .Bl -tag -width Ds
58 .It Fl c
59 .Nm
60 is actually a preprocessor for
61 .Xr dc 1 ,
62 which it invokes automatically, unless the
63 .Fl c
64 .Pq compile only
65 option is present.
66 In this case the generated
67 .Xr dc 1
68 instructions are sent to the standard output,
69 instead of being interpreted by a running
70 .Xr dc 1
71 process.
72 .It Fl e Ar expression , Fl Fl expression Ar expression
73 Evaluate
74 .Ar expression .
75 If multiple
76 .Fl e
77 options are specified, they are processed in the order given,
78 separated by newlines.
79 .It Fl h , Fl Fl help
80 Prints usage information.
81 .It Fl l , Fl Fl mathlib
82 Allow specification of an arbitrary precision math library.
83 The definitions in the library are available to command line
84 expressions.
85 .It Fl v , Fl Fl version
86 Prints version information.
87 .El
88 .Pp
89 The syntax for
90 .Nm
91 programs is as follows:
92 .Sq L
93 means letter a-z;
94 .Sq E
95 means expression;
96 .Sq S
97 means statement.
98 As a non-portable extension, it is possible to use long names
99 in addition to single letter names.
100 A long name is a sequence starting with a lowercase letter
101 followed by any number of lowercase letters and digits.
102 The underscore character
103 .Pq Sq _
104 counts as a letter.
105 .Pp
106 Comments
107 .Bd -unfilled -offset indent -compact
108 are enclosed in /* and */
109 are enclosed in # and the next newline
110 .Ed
111 .Pp
112 The newline is not part of the line comment,
113 which in itself is a non-portable extension.
114 .Pp
115 Names
116 .Bd -unfilled -offset indent -compact
117 simple variables: L
118 array elements: L [ E ]
119 The words `ibase', `obase', and `scale'
120 The word `last' or a single dot
121 .Ed
122 .Pp
123 Other operands
124 .Bd -unfilled -offset indent -compact
125 arbitrarily long numbers with optional sign and decimal point
126 ( E )
127 sqrt ( E )
128 length ( E )    number of significant decimal digits
129 scale ( E )     number of digits right of decimal point
130 L ( E , ... , E )
131 .Ed
132 .Pp
133 The sequence
134 .Sq \e<newline><whitespace>
135 is ignored within numbers.
136 .Pp
137 Operators
138 .Pp
139 The following arithmetic and logical operators can be used.
140 The semantics of the operators is the same as in the C language.
141 They are listed in order of decreasing precedence.
142 Operators in the same group have the same precedence.
143 .Bl -column "= += \-= *= /= %= ^=" "Associativity" "multiply, divide, modulus" -offset indent
144 .It Sy "Operator" Ta Sy "Associativity" Ta Sy "Description"
145 .It "++ \-\-" Ta "none" Ta "increment, decrement"
146 .It "\-" Ta "none" Ta "unary minus"
147 .It "^" Ta "right" Ta "power"
148 .It "* / %" Ta "left" Ta "multiply, divide, modulus"
149 .It "+ \-" Ta "left" Ta "plus, minus"
150 .It "= += -= *= /= %= ^=" Ta "right" Ta "assignment"
151 .It "== <= >= != < >" Ta "none" Ta "relational"
152 .It "!" Ta "none" Ta "boolean not"
153 .It "&&" Ta "left" Ta "boolean and"
154 .It "||" Ta "left" Ta "boolean or"
155 .El
156 .Pp
157 Note the following:
158 .Bl -bullet -offset indent
159 .It
160 The relational operators may appear in any expression.
161 The
162 .St -p1003.1-2008
163 standard only allows them in the conditional expression of an
164 .Sq if ,
165 .Sq while
166 or
167 .Sq for
168 statement.
169 .It
170 The relational operators have a lower precedence than the assignment
171 operators.
172 This has the consequence that the expression
173 .Sy a = b < c
174 is interpreted as
175 .Sy (a = b) < c ,
176 which is probably not what the programmer intended.
177 .It
178 In contrast with the C language, the relational operators all have
179 the same precedence, and are non-associative.
180 The expression
181 .Sy a < b < c
182 will produce a syntax error.
183 .It
184 The boolean operators (!, && and ||) are non-portable extensions.
185 .It
186 The boolean not
187 (!) operator has much lower precedence than the same operator in the
188 C language.
189 This has the consequence that the expression
190 .Sy !a < b
191 is interpreted as
192 .Sy !(a < b) .
193 Prudent programmers use parentheses when writing expressions involving
194 boolean operators.
195 .El
196 .Pp
197 Statements
198 .Bd -unfilled -offset indent -compact
199 E
200 { S ; ... ; S }
201 if ( E ) S
202 if ( E ) S else S
203 while ( E ) S
204 for ( E ; E ; E ) S
205 null statement
206 break
207 continue
208 quit
209 a string of characters, enclosed in double quotes
210 print E ,..., E
211 .Ed
212 .Pp
213 A string may contain any character, except double quote.
214 The if statement with an else branch is a non-portable extension.
215 All three E's in a for statement may be empty.
216 This is a non-portable extension.
217 The continue and print statements are also non-portable extensions.
218 .Pp
219 The print statement takes a list of comma-separated expressions.
220 Each expression in the list is evaluated and the computed
221 value is printed and assigned to the variable `last'.
222 No trailing newline is printed.
223 The expression may also be a string enclosed in double quotes.
224 Within these strings the following escape sequences may be used:
225 .Sq \ea
226 for bell (alert),
227 .Sq \eb
228 for backspace,
229 .Sq \ef
230 for formfeed,
231 .Sq \en
232 for newline,
233 .Sq \er
234 for carriage return,
235 .Sq \et
236 for tab,
237 .Sq \eq
238 for double quote and
239 .Sq \e\e
240 for backslash.
241 Any other character following a backslash will be ignored.
242 Strings will not be assigned to `last'.
243 .Pp
244 Function definitions
245 .Bd -unfilled -offset indent
246 define L ( L ,..., L ) {
247         auto L, ... , L
248         S; ... S
249         return ( E )
250 }
251 .Ed
252 .Pp
253 As a non-portable extension, the opening brace of the define statement
254 may appear on the next line.
255 The return statement may also appear in the following forms:
256 .Bd -unfilled -offset indent
257 return
258 return ()
259 return E
260 .Ed
261 .Pp
262 The first two are equivalent to the statement
263 .Dq return 0 .
264 The last form is a non-portable extension.
265 Not specifying a return statement is equivalent to writing
266 .Dq return (0) .
267 .Pp
268 Functions available in the math library, which is loaded by specifying the
269 .Fl l
270 flag on the command line
271 .Pp
272 .Bl -tag -width j(n,x) -offset indent -compact
273 .It s(x)
274 sine
275 .It c(x)
276 cosine
277 .It e(x)
278 exponential
279 .It l(x)
280 log
281 .It a(x)
282 arctangent
283 .It j(n,x)
284 Bessel function
285 .El
286 .Pp
287 All function arguments are passed by value.
288 .Pp
289 The value of a statement that is an expression is printed
290 unless the main operator is an assignment.
291 The value printed is assigned to the special variable `last'.
292 This is a non-portable extension.
293 A single dot may be used as a synonym for `last'.
294 Either semicolons or newlines may separate statements.
295 Assignment to
296 .Ar scale
297 influences the number of digits to be retained on arithmetic
298 operations in the manner of
299 .Xr dc 1 .
300 Assignments to
301 .Ar ibase
302 or
303 .Ar obase
304 set the input and output number radix respectively.
305 .Pp
306 The same letter may be used as an array, a function,
307 and a simple variable simultaneously.
308 All variables are global to the program.
309 `Auto' variables are pushed down during function calls.
310 When using arrays as function arguments
311 or defining them as automatic variables,
312 empty square brackets must follow the array name.
313 .Pp
314 For example
315 .Bd -literal -offset indent
316 scale = 20
317 define e(x){
318         auto a, b, c, i, s
319         a = 1
320         b = 1
321         s = 1
322         for(i=1; 1==1; i++){
323                 a = a*x
324                 b = b*i
325                 c = a/b
326                 if(c == 0) return(s)
327                 s = s+c
328         }
329 }
330 .Ed
331 .Pp
332 defines a function to compute an approximate value of
333 the exponential function and
334 .Pp
335 .Dl for(i=1; i<=10; i++) e(i)
336 .Pp
337 prints approximate values of the exponential function of
338 the first ten integers.
339 .Bd -literal -offset indent
340 $ bc -l -e 'scale = 500; 2 * a(2^10000)' -e quit
341 .Ed
342 .Pp
343 prints an approximation of pi.
344 .Sh COMMAND LINE EDITING
345 .Nm
346 supports interactive command line editing, via the
347 .Xr editline 3
348 library.
349 It is enabled by default if input is from a tty.
350 Previous lines can be recalled and edited with the arrow keys,
351 and other GNU Emacs-style editing keys may be used as well.
352 .Pp
353 The
354 .Xr editline 3
355 library is configured with a
356 .Pa .editrc
357 file \- refer to
358 .Xr editrc 5
359 for more information.
360 .Sh FILES
361 .Bl -tag -width /usr/share/misc/bc.library -compact
362 .It Pa /usr/share/misc/bc.library
363 math library, read when the
364 .Fl l
365 option is specified on the command line.
366 .El
367 .Sh COMPATIBILITY
368 The
369 .Fl q
370 and
371 .Fl Fl quiet
372 options are no-ops for compatibility with some other implementations of
373 .Nm
374 and their use is discouraged.
375 .Sh SEE ALSO
376 .Xr dc 1
377 .Sh STANDARDS
378 The
379 .Nm
380 utility is compliant with the
381 .St -p1003.1-2008
382 specification.
383 .Pp
384 The flags
385 .Op Fl ce ,
386 as well as the parts noted above,
387 are extensions to that specification.
388 .Sh HISTORY
389 The
390 .Nm
391 command first appeared in
392 .At v6 .
393 A complete rewrite of the
394 .Nm
395 command first appeared in
396 .Ox 3.5 .
397 .Sh AUTHORS
398 .An -nosplit
399 The original version of the
400 .Nm
401 command was written by
402 .An Robert Morris
403 and
404 .An Lorinda Cherry .
405 The current version of the
406 .Nm
407 utility was written by
408 .An Otto Moerbeek .
409 .Sh BUGS
410 .Ql Quit
411 is interpreted when read, not when executed.
412 .Pp
413 Some non-portable extensions, as found in the GNU version of the
414 .Nm
415 utility are not implemented (yet).