bc(1) General Commands Manual bc(1) (NAME) bc - (SYNOPSIS) bc [ -hlwsqv ] [long-options] [ file ... ] (DESCRIPTION) bc . () C . . . bc . bc . . ( bc .) bc bc POSIX . . . . (OPTIONS) -h, --help . -i, --interactive . -l, --mathlib . -w, --warn POSIX bc. -s, --standard POSIX bc. -q, --quiet GNU bc. -v, --version . (NUMBERS) bc . . . . ( / .) : (length) (scale). bc ( ) . : .000001 has a length of 6 and scale of 6. 1935.000 has a length of 7 and a scale of 3. (VARIABLES) : . . (underscore) . . ( . POSIX bc .) ([]) . : scale ibase obase last. scale . scale 0 . ibase obase . 10 . last ( ) . . . (COMMENTS) bc /* */ . . ( .) ( ) . bc . # . . (EXPRESSIONS) . . . ( .) . bc ibase ( ). ibase 2 36 ( 16 ). ibase 2 36 . 0-9 A-Z . (: .) ibase ( A = 10). bc ibase ibase-1 . ZZZ . . (scale) . . scale . scale 0 C . <> <> . name name[expr] . . - expr . ++ var . -- var . var ++ . var -- . expr + expr . expr - expr . expr * expr . expr / expr . scale . expr % expr <<>> : a%b a/b scale . a-(a/b)*b scale+scale(b) scale(a) . scale . expr ^ expr . ( ). scale . scale : (scale(a^b) = min(scale(a)*b, max(scale, scale(a)))). expr^0 1 . ( expr ) . var = expr . var = expr "var = var expr" "var" . "var" . 0 1 0 1. . ( POSIX bc if while for .) : expr1 < expr2 expr1 expr2 1 . expr1 <= expr2 expr1 expr2 1 . expr1 > expr2 expr1 expr2 1 . expr1 >= expr2 expr1 expr2 1 . expr1 == expr2 expr1 expr2 1 . expr1 != expr2 expr1 expr2 1 . ( POSIX bc ). 0 1 ( ) . : !expr expr 0 1 . expr && expr 1 . expr || expr 1 . : ( ) || && ! + - * / % ^ - ++ -- bc POSIX . . : a = 3 < 5 C "3 < 5" ( 1) "a" . bc 3 "a" 3 5 . . bc . . "name(parameters)" . . : length ( expression ) length . read ( ) read ( ) . . . read ibase . scale ( expression ) scale . sqrt ( expression ) sqrt () . . (STATEMENTS) ( ) . bc . . bc . - . . . "\" bc . (statement list) - . bc : ( ([]) .) expression : " ..." . . . "a=1" "(a=1)" . obase . obase 2 BC_BASE_MAX ( ). 2 16 . 16 bc 10 . . "obase-1" . . "\" . 70 . bc last . . last . last . ( (.) last .) string . (double quote) . . . print list print ( ) . "list" . . . last . print . (\) . bc : "a" ( ) "b" ( backspace) "f" ( form feed) "n" ( ) "r" ( carriage return) "q" ( ) "t" () "\" (). . { statement_list } . . if ( expression ) statement1 [else statement2] if statement1 statement2 . statement1 . statement2 0 statement2 . ( else .) while ( expression ) statement while statement . . break . for ( [expression1] ; [expression2] ; [expression3] ) statement for . Expression1 . Expression2 . . . expression3 expression2 . expression1 expression3 . expression2 1 expression2 . ( POSIX bc .) for : expression1; while (expression2) { statement; expression3; } break while for . continue continue ( ) for . halt halt ( ) bc . "if (0 == 1) halt" bc halt . return 0 . ( .) return ( expression ) . ( .) . (PSEUDO STATEMENTS) . <<>> . limits bc. . quit quit bc quit . "if (0 == 1) quit" bc . warranty . . (FUNCTIONS) . bc . <<>> . . . : define name ( parameters ) { newline auto_list statement_list } "name(parameters)" . ( ). . (call by value) . "name[]" . . . . . . . auto_list <<>> . ( ) "auto name, ... ;" (- ). name (auto) . . (push). . (pop) ( ) . . A B B A B . bc . bc . - . return . return : "return" 0 . "return ( expression )" . "return (0)" . return 0 . ibase . ibase . ibase read ibase . . . define . bc . : define d (n) { return (2*n); } define d (n) { return (2*n); } void . void . void . void define . : define py (y) { print "--->", y, "<---", "\n"; } define void px (x) { print "--->", x, "<---", "\n"; } py(1) --->1<--- 0 px(1) --->1<--- py void py(1) . return . px(1) void . () . "*name[]" . . (MATH LIBRARY) bc -l (scale) 20 . . : s (x) x x . c (x) x x . a (x) x . l (x) x. e (x) e x. j (n,x) (Bessel) n x. (EXAMPLES) /bin/sh ("pi") pi : pi=$(echo "scale=10; 4*a(1)" | bc -l) . POSIX bc : scale = 20 /* Uses the fact that e^x = (e^(x/2))^2 When x is small enough, we use the series: e^x = 1 + x + x^2/2! + x^3/3! + ... */ define e(x) { auto a, d, e, f, i, m, v, z /* Check the sign of x. */ if (x<0) { m = 1 x = -x } /* Precondition x. */ z = scale; scale = 4 + z + .44*x; while (x > 1) { f += 1; x /= 2; } /* Initialize the variables. */ v = 1+x a = x d = 1 for (i=2; 1; i++) { e = (a *= x) / (d *= i) if (e == 0) { if (f>0) while (f--) v = v*v; scale = z if (m) return (1/v); return (v/1); } v += e } } bc . : scale=2 print "\nCheck book program!\n" print " Remember, deposits are negative transactions.\n" print " Exit by a 0 transaction.\n\n" print "Initial balance? "; bal = read() bal /= 1 print "\n" while (1) { "current balance = "; bal "transaction? "; trans = read() if (trans == 0) break; bal -= trans bal /= 1 } quit : define f (x) { if (x <= 1) return (1); return (f(x-1) * x); } READLINE LIBEDIT (READLINE AND LIBEDIT OPTIONS) GNU bc ( ) GNU readline BSD libedit . bc . . bc : history . readline -1 . history . 0 . 100 . GNU readline history BSD libedit . readline libedit . (DIFFERENCES) bc POSIX P1003.2/D11 . dc(1) . . <<>> (-c) . . ( ) ( ) . : LANG LANG _LC POSIX . POSIX bc . . NUL . POSIX . last POSIX bc last . bc (.) . POSIX bc if while for . . if else POSIX bc else . for POSIX bc for . && || ! POSIX bc . read POSIX bc read . print POSIX bc print . continue POSIX bc continue . return POSIX bc return . POSIX bc ( ) . POSIX ( ). bc . POSIX bc define auto . =+, =-, =*, =/, =%, =^ POSIX bc << >> . . limits . "a =- 1" a -1 a . bc . "x=1 3" 13 x . bc . . . . . . : a = 1 b = 2 : { a = 1 b = 2 } . . . (Interrupts) SIGINT ( control-C ) . << >> . bc . . . SIGINT bc . (LIMITS) bc . . limits . BC_BASE_MAX 10^9 . 16 . BC_DIM_MAX 65535 . BC_SCALE_MAX INT_MAX . INT_MAX . BC_STRING_MAX INT_MAX . (exponent) (^) LONG_MAX . (variable names) 32767 . (ENVIRONMENT VARIABLES) bc : POSIXLY_CORRECT -s . BC_ENV_ARGS bc . . . <<>> bc . bc . BC_LINE_LENGTH . . . 3 70 . (DIAGNOSTICS) bc . . (BUGS) . : bug-bc@gnu.org. <> (Subject:) . (AUTHORS) Philip A. Nelson philnelson@acm.org (ACKNOWLEDGEMENTS) Steve Sommars (Steve.Sommars@att.com) . . (SEE ALSO) dc(1) GNU Project 2025-01-10 bc(1)