sbase

suckless unix tools
git clone git://git.suckless.org/sbase
Log | Files | Refs | README | LICENSE

bc.1 (6568B)


      1 .Dd December 31, 2025
      2 .Dt BC 1
      3 .Os sbase
      4 .Sh NAME
      5 .Nm bc
      6 .Nd arbitrary-precision arithmetic language
      7 .Sh SYNOPSIS
      8 .Nm
      9 .Op Fl cdls
     10 .Op Ar file ...
     11 .Sh DESCRIPTION
     12 .Nm
     13 is an arbitrary-precision arithmetic language with syntax similar to C.
     14 .Nm
     15 reads each
     16 .Ar file
     17 in sequence and compiles the bc code into dc code,
     18 which is then executed
     19 by spawning
     20 .Xr dc 1
     21 as a subprocess.
     22 After all the files are loaded and executed then
     23 it reads from stdin.
     24 .Sh OPTIONS
     25 .Bl -tag -width Ds
     26 .It Fl c
     27 Compile only mode.
     28 Generate dc code without spawning a dc subprocess.
     29 The compiled dc code is written to stdout.
     30 .It Fl d
     31 Debug mode.
     32 Enable yacc parser debugging output.
     33 .It Fl l
     34 Load the mathematical library
     35 that is loaded before any file from the command line.
     36 .It Fl s
     37 Suppresses the automatic printing of expression results.
     38 In this mode, only explicit
     39 .Ic print
     40 statements produce output.
     41 .El
     42 .Sh LANGUAGE
     43 .Ss Comments
     44 Comments are enclosed in
     45 .Ql /*
     46 and
     47 .Ql */ .
     48 .Ss Numbers
     49 Numbers may contain digits 0-9 and, when the input base is greater than 10,
     50 letters A-F as hexadecimal digits.
     51 Numbers may include a decimal point.
     52 .Ss Variables
     53 Variables are single lowercase letters
     54 .Ql a
     55 through
     56 .Ql z .
     57 Variables hold arbitrary-precision numbers and are automatically initialized to 0.
     58 The special variable .
     59 holds the value of the last expression calculated,
     60 useful to avoid retyping long numbers.
     61 .Ss Arrays
     62 Array elements are referenced as
     63 .Ar name Ns Oo Ar expr Oc .
     64 Arrays are single lowercase letters
     65 .Ql a
     66 through
     67 .Ql z .
     68 Array indices may be any expression.
     69 Arrays are automatically initialized with all elements set to 0.
     70 .Ss Special Variables
     71 .Bl -tag -width "scale"
     72 .It Ic scale
     73 The number of digits after the decimal point in results.
     74 Default is 0.
     75 Affects division, modulus, power, and square root operations.
     76 .It Ic ibase
     77 The input number base.
     78 Must be between 2 and 16 inclusive.
     79 Default is 10.
     80 .It Ic obase
     81 The output number base.
     82 Must be at least 2.
     83 Default is 10.
     84 .El
     85 .Ss Operators
     86 Arithmetic operators in order of precedence (highest to lowest):
     87 .Bl -tag -width "^"
     88 .It Ic \&^ ^=
     89 Exponentiation (right associative).
     90 The exponent is truncated to an integer.
     91 .It Ic * / % *= /= %=
     92 Multiplication, division, modulus.
     93 .It Ic + \- += \-=
     94 Addition, subtraction.
     95 .It Ic ++ \-\-
     96 Increment and decrement (prefix or postfix).
     97 .It Ic =
     98 Assignment.
     99 .El
    100 .Ss Built-in Functions
    101 .Bl -tag -width "length(expr)"
    102 .It Fn sqrt expr
    103 Square root of
    104 .Ar expr .
    105 .It Fn length expr
    106 Number of significant decimal digits in
    107 .Ar expr .
    108 .It Fn scale expr
    109 Number of digits after the decimal point in
    110 .Ar expr .
    111 .El
    112 .Ss Expressions
    113 .Pp
    114 Expressions are combinations of operators,
    115 function calls,
    116 numbers and variables following the
    117 normal arithmetic rules.
    118 Parenthesis can be used to modify the precedence of operators.
    119 .Ss Relational
    120 .Pp
    121 Relational expressions are composed by
    122 expressions combined using relational operators.
    123 They only can be used in the context of
    124 a
    125 .Ic if ,
    126 .Ic while
    127 or
    128 .Ic for
    129 statements.
    130 .Pp
    131 Relational operators:
    132 .Bl -tag -width "!="
    133 .It Ic ==
    134 Equal to.
    135 .It Ic !=
    136 Not equal to.
    137 .It Ic <
    138 Less than.
    139 .It Ic <=
    140 Less than or equal to.
    141 .It Ic >
    142 Greater than.
    143 .It Ic >=
    144 Greater than or equal to.
    145 .El
    146 .Ss Statements
    147 .Bl -tag -width Ds
    148 .It Ar expr
    149 A expression in a single line,
    150 or separated by the character
    151 .Ar ;
    152 is a statement.
    153 If the expression is not an assignment expression then
    154 the result value is printed to stdout
    155 unless the option
    156 .Ic -s
    157 is used.
    158 .It Ic print Ar expr
    159 Print the value of
    160 .Ar expr
    161 followed by a newline.
    162 .It Ic print Qo Ar string Qc
    163 Print
    164 .Ar string
    165 without a newline.
    166 .It Ic print Qo Ar string Qc , Ar expr
    167 Print
    168 .Ar string
    169 without a newline, then print
    170 .Ar expr
    171 with a newline.
    172 .It Qo Ar string Qc
    173 A string by itself is printed without a newline.
    174 .It Ic if ( Ar rel ) Ar stat
    175 Execute
    176 .Ar stat
    177 if
    178 .Ar rel
    179 is non-zero.
    180 .It Ic while ( Ar rel ) Ar stat
    181 Execute
    182 .Ar stat
    183 repeatedly while
    184 .Ar rel
    185 is non-zero.
    186 .It Ic for ( Ar expr1 ; Ar rel ; Ar expr2 ) Ar stat
    187 Equivalent to
    188 .Ar expr1 ;
    189 .Ic while ( Ar rel )
    190 {
    191 .Ar stat ;
    192 .Ar expr2
    193 }.
    194 The 3 components of the for loop are required.
    195 .It Ic break
    196 Exit from the innermost
    197 .Ic while
    198 or
    199 .Ic for
    200 loop.
    201 .It Ic quit
    202 Exit
    203 .Nm
    204 when the statement is read,
    205 independently of being under an if statement or in a function.
    206 .It Ic return
    207 Return 0 from a function.
    208 .It Ic return ( )
    209 Return 0 from a function.
    210 .It Ic return ( Ar expr )
    211 Return
    212 .Ar expr
    213 from a function.
    214 .It Ic { Ar stat-list Ic }
    215 Group statements.
    216 .El
    217 .Ss Function Definitions
    218 Functions are defined as:
    219 .Bd -literal -offset indent
    220 define name(parameters) {
    221 	auto local-variables
    222 	statements
    223 }
    224 .Ed
    225 .Pp
    226 Notice that the opening brace must be in the same line
    227 than the define statement.
    228 Function names are single lowercase letters.
    229 Parameters and local variables are comma-separated lists of simple
    230 variables or arrays (denoted by
    231 .Ar array Ns Ic [] ) .
    232 The
    233 .Ic auto
    234 statement is optional and must appear first in the function body if present.
    235 .Pp
    236 Functions are called as
    237 .Fn name arguments .
    238 Array arguments must be passed as
    239 .Ar array Ns Ic [] .
    240 Functions return a value using the
    241 .Ic return
    242 statement.
    243 If no
    244 .Ic return
    245 is executed, the function returns 0.
    246 .Ss Namespaces
    247 The variables, arrays and function names
    248 are composed of only one letter,
    249 but they are independent namespaces.
    250 The same letter can be used for a variable,
    251 array or function without problems.
    252 .Sh LIBRARY
    253 When invoked with the
    254 .Fl l
    255 option,
    256 .Nm
    257 preloads a mathematical library that defines the following functions:
    258 .Bl -tag -width "j(n,x)"
    259 .It Fn e x
    260 Exponential function.
    261 Returns e raised to the power
    262 .Ar x .
    263 .It Fn l x
    264 Natural logarithm of
    265 .Ar x .
    266 .It Fn s x
    267 Sine of
    268 .Ar x
    269 where
    270 .Ar x
    271 is in radians.
    272 .It Fn c x
    273 Cosine of
    274 .Ar x
    275 where
    276 .Ar x
    277 is in radians.
    278 .It Fn a x
    279 Arctangent of
    280 .Ar x .
    281 Returns the value in radians.
    282 .It Fn j n,x
    283 Bessel function of order
    284 .Ar n
    285 of
    286 .Ar x .
    287 .El
    288 .Pp
    289 The library also sets
    290 .Ic scale
    291 to 20 by default.
    292 .Sh IMPLEMENTATION NOTES
    293 This implementation of
    294 .Nm
    295 is a compiler that translates bc language into dc commands.
    296 .Pp
    297 Variables are mapped to dc registers.
    298 Functions are compiled to dc macros stored in registers identified by
    299 function name.
    300 Control flow statements are implemented using dc's conditional macro
    301 execution commands.
    302 .Pp
    303 The maximum nesting level for control structures and function calls is 32.
    304 .Sh SEE ALSO
    305 .Xr dc 1
    306 .Rs
    307 .%A L. L. Cherry
    308 .%A R. H. Morris
    309 .%T "BC \(em An Arbitrary Precision Desk-Calculator Language"
    310 .Re
    311 .Sh STANDARDS
    312 POSIX.1-2013.
    313 The
    314 .Ic print
    315 statement and the
    316 .Fl d
    317 and
    318 .Fl s
    319 flags are extensions to the POSIX specification.