Annotation of 43BSDReno/share/doc/usd/05.dc/dc, revision 1.1.1.1

1.1       root        1: .\"    @(#)dc  6.1 (Berkeley) 5/22/86
                      2: .\"
                      3: .EH 'USD:5-%''DC \- An Interactive Desk Calculator'
                      4: .OH 'DC \- An Interactive Desk Calculator''USD:5-%'
                      5: .\".RP
                      6: ....TM 75-1271-8 39199 39199-11
                      7: .ND
                      8: .TL
                      9: DC \- An Interactive Desk Calculator
                     10: .AU "MH 2C-524" 3878
                     11: Robert Morris
                     12: .AU
                     13: Lorinda Cherry
                     14: .AI
                     15: .MH
                     16: .AB
                     17: DC is an interactive desk calculator program implemented
                     18: on the
                     19: .UX
                     20: time-sharing system to do arbitrary-precision
                     21: integer arithmetic.
                     22: It has provision for manipulating scaled fixed-point numbers and
                     23: for input and output in bases other than decimal.
                     24: .PP
                     25: The size of numbers that can be manipulated is limited
                     26: only by available core storage.
                     27: On typical implementations of
                     28: .UX ,
                     29: the size of numbers that
                     30: can be handled varies from several hundred digits on the smallest
                     31: systems to several thousand on the largest.
                     32: .AE
                     33: .PP
                     34: .SH
                     35: .PP
                     36: DC is an arbitrary precision arithmetic package implemented
                     37: on the
                     38: .UX
                     39: time-sharing system
                     40: in the form of an interactive desk calculator.
                     41: It works like a stacking calculator using reverse Polish notation.
                     42: Ordinarily DC operates on decimal integers, but one may
                     43: specify an input base, output base, and a number of fractional
                     44: digits to be maintained.
                     45: .PP
                     46: A language called BC [1] has been developed which accepts
                     47: programs written in the familiar style of higher-level
                     48: programming languages and compiles output which is
                     49: interpreted by DC.
                     50: Some of the commands described below were designed
                     51: for the compiler interface and are not easy for a human user
                     52: to manipulate.
                     53: .PP
                     54: Numbers that are typed into DC are put on a push-down
                     55: stack.
                     56: DC commands work by taking the top number or two
                     57: off the stack, performing the desired operation, and pushing the result
                     58: on the stack.
                     59: If an argument is given,
                     60: input is taken from that file until its end,
                     61: then from the standard input.
                     62: .SH
                     63: SYNOPTIC DESCRIPTION
                     64: .PP
                     65: Here we describe the DC commands that are intended
                     66: for use by people.  The additional commands that are
                     67: intended to be invoked by compiled output are
                     68: described in the detailed description.
                     69: .PP
                     70: Any number of commands are permitted on a line.
                     71: Blanks and new-line characters are ignored except within numbers
                     72: and in places where a register name is expected.
                     73: .PP
                     74: The following constructions are recognized:
                     75: .SH
                     76: number
                     77: .IP
                     78: The value of the number is pushed onto the main stack.
                     79: A number is an unbroken string of the digits 0-9
                     80: and the capital letters A\-F which are treated as digits
                     81: with values 10\-15 respectively.
                     82: The number may be preceded by an underscore \*_ to input a
                     83: negative number.
                     84: Numbers may contain decimal points.
                     85: .SH
                     86: +  \-  *  %  ^
                     87: .IP
                     88: The
                     89: top two values on the stack are added
                     90: (\fB+\fP),
                     91: subtracted
                     92: (\fB\-\fP),
                     93: multiplied (\fB*\fP),
                     94: divided (\fB/\fP),
                     95: remaindered (\fB%\fP),
                     96: or exponentiated (^).
                     97: The two entries are popped off the stack;
                     98: the result is pushed on the stack in their place.
                     99: The result of a division is an integer truncated toward zero.
                    100: See the detailed description below for the treatment of
                    101: numbers with decimal points.
                    102: An exponent must not have any digits after the decimal point.
                    103: .SH
                    104: s\fIx\fP
                    105: .IP
                    106: The
                    107: top of the main stack is popped and stored into
                    108: a register named \fIx\fP, where \fIx\fP may be any character.
                    109: If
                    110: the
                    111: .ft B
                    112: s
                    113: .ft
                    114: is capitalized,
                    115: .ft I
                    116: x
                    117: .ft
                    118: is treated as a stack and the value is pushed onto it.
                    119: Any character, even blank or new-line, is a valid register name.
                    120: .SH
                    121: l\fIx\fP
                    122: .IP
                    123: The
                    124: value in register
                    125: .ft I
                    126: x
                    127: .ft
                    128: is pushed onto the stack.
                    129: The register
                    130: .ft I
                    131: x
                    132: .ft
                    133: is not altered.
                    134: If the
                    135: .ft B
                    136: l
                    137: .ft
                    138: is capitalized,
                    139: register
                    140: .ft I
                    141: x
                    142: .ft
                    143: is treated as a stack and its top value is popped onto the main stack.
                    144: .LP
                    145: All registers start with empty value which is treated as a zero
                    146: by the command \fBl\fP and is treated as an error by the command \fBL\fP.
                    147: .SH
                    148: .SH
                    149: d
                    150: .IP
                    151: The
                    152: top value on the stack is duplicated.
                    153: .SH
                    154: p
                    155: .IP
                    156: The top value on the stack is printed.
                    157: The top value remains unchanged.
                    158: .SH
                    159: f
                    160: .IP
                    161: All values on the stack and in registers are printed.
                    162: .SH
                    163: x
                    164: .IP
                    165: treats the top element of the stack as a character string,
                    166: removes it from the stack, and
                    167: executes it as a string of DC commands.
                    168: .SH
                    169: [ ... ]
                    170: .IP
                    171: puts the bracketed character string onto the top of the stack.
                    172: .SH
                    173: q
                    174: .IP
                    175: exits the program.
                    176: If executing a string, the recursion level is
                    177: popped by two.
                    178: If
                    179: .ft B
                    180: q
                    181: .ft
                    182: is capitalized,
                    183: the top value on the stack is popped and the string execution level is popped
                    184: by that value.
                    185: .SH
                    186: <\fIx\fP  >\fIx\fP  =\fIx\fP  !<\fIx\fP  !>\fIx\fP  !=\fIx\fP
                    187: .IP
                    188: The
                    189: top two elements of the stack are popped and compared.
                    190: Register
                    191: .ft I
                    192: x
                    193: .ft
                    194: is executed if they obey the stated
                    195: relation.
                    196: Exclamation point is negation.
                    197: .SH
                    198: v
                    199: .IP
                    200: replaces the top element on the stack by its square root.
                    201: The square root of an integer is truncated to an integer.
                    202: For the treatment of numbers with decimal points, see
                    203: the detailed description below.
                    204: .SH
                    205: !
                    206: .IP
                    207: interprets the rest of the line as a
                    208: .UX
                    209: command.
                    210: Control returns to DC when the
                    211: .UX
                    212: command terminates.
                    213: .SH
                    214: c
                    215: .IP
                    216: All values on the stack are popped; the stack becomes empty.
                    217: .SH
                    218: i
                    219: .IP
                    220: The top value on the stack is popped and used as the
                    221: number radix for further input.
                    222: If \fBi\fP is capitalized, the value of
                    223: the input base is pushed onto the stack.
                    224: No mechanism has been provided for the input of arbitrary
                    225: numbers in bases less than 1 or greater than 16.
                    226: .SH
                    227: o
                    228: .IP
                    229: The top value on the stack is popped and used as the
                    230: number radix for further output.
                    231: If \fBo\fP is capitalized, the value of the output
                    232: base is pushed onto the stack.
                    233: .SH
                    234: k
                    235: .IP
                    236: The top of the stack is popped, and that value is used as
                    237: a scale factor
                    238: that influences the number of decimal places
                    239: that are maintained during multiplication, division, and exponentiation.
                    240: The scale factor must be greater than or equal to zero and
                    241: less than 100.
                    242: If \fBk\fP is capitalized, the value of the scale factor
                    243: is pushed onto the stack.
                    244: .SH
                    245: z
                    246: .IP
                    247: The value of the stack level is pushed onto the stack.
                    248: .SH
                    249: ?
                    250: .IP
                    251: A line of input is taken from the input source (usually the console)
                    252: and executed.
                    253: .SH
                    254: DETAILED DESCRIPTION
                    255: .SH
                    256: Internal Representation of Numbers
                    257: .PP
                    258: Numbers are stored internally using a dynamic storage allocator.
                    259: Numbers are kept in the form of a string
                    260: of digits to the base 100 stored one digit per byte
                    261: (centennial digits).
                    262: The string is stored with the low-order digit at the
                    263: beginning of the string.
                    264: For example, the representation of 157
                    265: is 57,1.
                    266: After any arithmetic operation on a number, care is taken
                    267: that all digits are in the range 0\-99 and that
                    268: the number has no leading zeros.
                    269: The number zero is represented by the empty string.
                    270: .PP
                    271: Negative numbers are represented in the 100's complement
                    272: notation, which is analogous to two's complement notation for binary
                    273: numbers.
                    274: The high order digit of a negative number is always \-1
                    275: and all other digits are in the range 0\-99.
                    276: The digit preceding the high order \-1 digit is never a 99.
                    277: The representation of \-157 is 43,98,\-1.
                    278: We shall call this the canonical form of a number.
                    279: The advantage of this kind of representation of negative
                    280: numbers is ease of addition.  When addition is performed digit
                    281: by digit, the result is formally correct.  The result need only
                    282: be modified, if necessary, to put it into canonical form.
                    283: .PP
                    284: Because the largest valid digit is 99 and the byte can
                    285: hold numbers twice that large, addition can be carried out
                    286: and the handling of carries done later when
                    287: that is convenient, as it sometimes is.
                    288: .PP
                    289: An additional byte is stored with each number beyond
                    290: the high order digit to indicate the number of
                    291: assumed decimal digits after the decimal point.  The representation
                    292: of .001 is 1,\fI3\fP
                    293: where the scale has been italicized to emphasize the fact that it
                    294: is not the high order digit.
                    295: The value of this extra byte is called the
                    296: .ft B
                    297: scale factor
                    298: .ft
                    299: of the number.
                    300: .SH
                    301: The Allocator
                    302: .PP
                    303: DC uses a dynamic string storage allocator
                    304: for all of its internal storage.
                    305: All reading and writing of numbers internally is done through
                    306: the allocator.
                    307: Associated with each string in the allocator is a four-word header containing pointers
                    308: to the beginning of the string, the end of the string,
                    309: the next place to write, and the next place to read.
                    310: Communication between the allocator and DC
                    311: is done via pointers to these headers.
                    312: .PP
                    313: The allocator initially has one large string on a list
                    314: of free strings.  All headers except the one pointing
                    315: to this string are on a list of free headers.
                    316: Requests for strings are made by size.
                    317: The size of the string actually supplied is the next higher
                    318: power of 2.
                    319: When a request for a string is made, the allocator
                    320: first checks the free list to see if there is
                    321: a string of the desired size.
                    322: If none is found, the allocator finds the next larger free string and splits it repeatedly until
                    323: it has a string of the right size.
                    324: Left-over strings are put on the free list.
                    325: If there are no larger strings,
                    326: the allocator tries to coalesce smaller free strings into
                    327: larger ones.
                    328: Since all strings are the result
                    329: of splitting large strings,
                    330: each string has a neighbor that is next to it in core
                    331: and, if free, can be combined with it to make a string twice as long.
                    332: This is an implementation of the `buddy system' of allocation
                    333: described in [2].
                    334: .PP
                    335: Failing to find a string of the proper length after coalescing,
                    336: the allocator asks the system for more space.
                    337: The amount of space on the system is the only limitation
                    338: on the size and number of strings in DC.
                    339: If at any time in the process of trying to allocate a string, the allocator runs out of
                    340: headers, it also asks the system for more space.
                    341: .PP
                    342: There are routines in the allocator for reading, writing, copying, rewinding,
                    343: forward-spacing, and backspacing strings.
                    344: All string manipulation is done using these routines.
                    345: .PP
                    346: The reading and writing routines
                    347: increment the read pointer or write pointer so that
                    348: the characters of a string are read or written in
                    349: succession by a series of read or write calls.
                    350: The write pointer is interpreted as the end of the
                    351: information-containing portion of a string and a call
                    352: to read beyond that point returns an end-of-string indication.
                    353: An attempt to write beyond the end of a string
                    354: causes the allocator to
                    355: allocate a larger space and then copy
                    356: the old string into the larger block.
                    357: .SH
                    358: Internal Arithmetic
                    359: .PP
                    360: All arithmetic operations are done on integers.
                    361: The operands (or operand) needed for the operation are popped
                    362: from the main stack and their scale factors stripped off.
                    363: Zeros are added or digits removed as necessary to get
                    364: a properly scaled result from the internal arithmetic routine.
                    365: For example, if the scale of the operands is different and decimal
                    366: alignment is required, as it is for
                    367: addition, zeros are appended to the operand with the smaller
                    368: scale.
                    369: After performing the required arithmetic operation,
                    370: the proper scale factor is appended to the end of the number before
                    371: it is pushed on the stack.
                    372: .PP
                    373: A register called \fBscale\fP plays a part
                    374: in the results of most arithmetic operations.
                    375: \fBscale\fP is the bound on the number of decimal places retained in
                    376: arithmetic computations.
                    377: \fBscale\fP may be set to the number on the top of the stack
                    378: truncated to an integer with the \fBk\fP command.
                    379: \fBK\fP may be used to push the value of \fBscale\fP on the stack.
                    380: \fBscale\fP must be greater than or equal to 0 and less than 100.
                    381: The descriptions of the individual arithmetic operations will
                    382: include the exact effect of \fBscale\fP on the computations.
                    383: .SH
                    384: Addition and Subtraction
                    385: .PP
                    386: The scales of the two numbers are compared and trailing
                    387: zeros are supplied to the number with the lower scale to give both
                    388: numbers the same scale.  The number with the smaller scale is
                    389: multiplied by 10 if the difference of the scales is odd.
                    390: The scale of the result is then set to the larger of the scales
                    391: of the two operands.
                    392: .PP
                    393: Subtraction is performed by negating the number
                    394: to be subtracted and proceeding as in addition.
                    395: .PP
                    396: Finally, the addition is performed digit by digit from the
                    397: low order end of the number.  The carries are propagated
                    398: in the usual way.
                    399: The resulting number is brought into canonical form, which may
                    400: require stripping of leading zeros, or for negative numbers
                    401: replacing the high-order configuration 99,\-1 by the digit \-1.
                    402: In any case, digits which are not in the range 0\-99 must
                    403: be brought into that range, propagating any carries or borrows
                    404: that result.
                    405: .SH
                    406: Multiplication
                    407: .PP
                    408: The scales are removed from the two operands and saved.
                    409: The operands are both made positive.
                    410: Then multiplication is performed in
                    411: a digit by digit manner that exactly mimics the hand method
                    412: of multiplying.
                    413: The first number is multiplied by each digit of the second
                    414: number, beginning with its low order digit.  The intermediate
                    415: products are accumulated into a partial sum which becomes the
                    416: final product.
                    417: The product is put into the canonical form and its sign is
                    418: computed from the signs of the original operands.
                    419: .PP
                    420: The scale of the result is set equal to the sum
                    421: of the scales of the two operands.
                    422: If that scale is larger than the internal register
                    423: .ft B
                    424: scale
                    425: .ft
                    426: and also larger than both of the scales of the two operands,
                    427: then the scale of the result is set equal to the largest
                    428: of these three last quantities.
                    429: .SH
                    430: Division
                    431: .PP
                    432: The scales are removed from the two operands.
                    433: Zeros are appended or digits removed from the dividend to make
                    434: the scale of the result of the integer division equal to
                    435: the internal quantity
                    436: \fBscale\fP.
                    437: The signs are removed and saved.
                    438: .PP
                    439: Division is performed much as it would be done by hand.
                    440: The difference of the lengths of the two numbers
                    441: is computed.
                    442: If the divisor is longer than the dividend,
                    443: zero is returned.
                    444: Otherwise the top digit of the divisor is divided into the top
                    445: two digits of the dividend.
                    446: The result is used as the first (high-order) digit of the
                    447: quotient.
                    448: It may turn out be one unit too low, but if it is, the next
                    449: trial quotient will be larger than 99 and this will be
                    450: adjusted at the end of the process.
                    451: The trial digit is multiplied by the divisor and the result subtracted
                    452: from the dividend and the process is repeated to get
                    453: additional quotient digits until the remaining
                    454: dividend is smaller than the divisor.
                    455: At the end, the digits of the quotient are put into
                    456: the canonical form, with propagation of carry as needed.
                    457: The sign is set from the sign of the operands.
                    458: .SH
                    459: Remainder
                    460: .PP
                    461: The division routine is called and division is performed
                    462: exactly as described.  The quantity returned is the remains of the
                    463: dividend at the end of the divide process.
                    464: Since division truncates toward zero, remainders have the same
                    465: sign as the dividend.
                    466: The scale of the remainder is set to 
                    467: the maximum of the scale of the dividend and
                    468: the scale of the quotient plus the scale of the divisor.
                    469: .SH
                    470: Square Root
                    471: .PP
                    472: The scale is stripped from the operand.
                    473: Zeros are added if necessary to make the
                    474: integer result have a scale that is the larger of
                    475: the internal quantity
                    476: \fBscale\fP
                    477: and the scale of the operand.
                    478: .PP
                    479: The method used to compute sqrt(y) is Newton's method
                    480: with successive approximations by the rule
                    481: .EQ
                    482: x sub {n+1} ~=~ half ( x sub n + y over x sub n )
                    483: .EN
                    484: The initial guess is found by taking the integer square root
                    485: of the top two digits.
                    486: .SH
                    487: Exponentiation
                    488: .PP
                    489: Only exponents with zero scale factor are handled.  If the exponent is
                    490: zero, then the result is 1.  If the exponent is negative, then
                    491: it is made positive and the base is divided into one.  The scale
                    492: of the base is removed.
                    493: .PP
                    494: The integer exponent is viewed as a binary number.
                    495: The base is repeatedly squared and the result is
                    496: obtained as a product of those powers of the base that
                    497: correspond to the positions of the one-bits in the binary
                    498: representation of the exponent.
                    499: Enough digits of the result
                    500: are removed to make the scale of the result the same as if the
                    501: indicated multiplication had been performed.
                    502: .SH
                    503: Input Conversion and Base
                    504: .PP
                    505: Numbers are converted to the internal representation as they are read
                    506: in.
                    507: The scale stored with a number is simply the number of fractional digits input.
                    508: Negative numbers are indicated by preceding the number with a \fB\_\fP (an 
                    509: underscore).
                    510: The hexadecimal digits A\-F correspond to the numbers 10\-15 regardless of input base.
                    511: The \fBi\fP command can be used to change the base of the input numbers.
                    512: This command pops the stack, truncates the resulting number to an integer,
                    513: and uses it as the input base for all further input.
                    514: The input base is initialized to 10 but may, for example be changed to
                    515: 8 or 16 to do octal or hexadecimal to decimal conversions.
                    516: The command \fBI\fP will push the value of the input base on the stack.
                    517: .SH
                    518: Output Commands
                    519: .PP
                    520: The command \fBp\fP causes the top of the stack to be printed.
                    521: It does not remove the top of the stack.
                    522: All of the stack and internal registers can be output
                    523: by typing the command \fBf\fP.
                    524: The \fBo\fP command can be used to change the output base.
                    525: This command uses the top of the stack, truncated to an integer as
                    526: the base for all further output.
                    527: The output base in initialized to 10.
                    528: It will work correctly for any base.
                    529: The command \fBO\fP pushes the value of the output base on the stack.
                    530: .SH
                    531: Output Format and Base
                    532: .PP
                    533: The input and output bases only affect
                    534: the interpretation of numbers on input and output; they have no
                    535: effect on arithmetic computations.
                    536: Large numbers are output with 70 characters per line;
                    537: a \\ indicates a continued line.
                    538: All choices of input and output bases work correctly, although not all are
                    539: useful.
                    540: A particularly useful output base is 100000, which has the effect of
                    541: grouping digits in fives.
                    542: Bases of 8 and 16 can be used for decimal-octal or decimal-hexadecimal
                    543: conversions.
                    544: .SH
                    545: Internal Registers
                    546: .PP
                    547: Numbers or strings may be stored in internal registers or loaded on the stack
                    548: from registers with the commands \fBs\fP and \fBl\fP.
                    549: The command \fBs\fIx\fR pops the top of the stack and
                    550: stores the result in register \fBx\fP.
                    551: \fIx\fP can be any character.
                    552: \fBl\fIx\fR puts the contents of register \fBx\fP on the top of the stack.
                    553: The \fBl\fP command has no effect on the contents of register \fIx\fP.
                    554: The \fBs\fP command, however, is destructive.
                    555: .SH
                    556: Stack Commands
                    557: .PP
                    558: The command \fBc\fP clears the stack.
                    559: The command \fBd\fP pushes a duplicate of the number on the top of the stack
                    560: on the stack.
                    561: The command \fBz\fP pushes the stack size on the stack.
                    562: The command \fBX\fP replaces the number on the top of the stack
                    563: with its scale factor.
                    564: The command \fBZ\fP replaces the top of the stack
                    565: with its length.
                    566: .SH
                    567: Subroutine Definitions and Calls
                    568: .PP
                    569: Enclosing a string in \fB[ ]\fP pushes the ascii string on the stack.
                    570: The \fBq\fP command quits or in executing a string, pops the recursion levels by two.
                    571: .SH
                    572: Internal Registers \- Programming DC
                    573: .PP
                    574: The load and store
                    575: commands together with \fB[ ]\fP to store strings, \fBx\fP to execute
                    576: and the testing commands `<', `>', `=', `!<', `!>', `!=' can be used to program
                    577: DC.
                    578: The \fBx\fP command assumes the top of the stack is an string of DC commands
                    579: and executes it.
                    580: The testing commands compare the top two elements on the stack and if the relation holds, execute the register
                    581: that follows the relation.
                    582: For example, to print the numbers 0-9,
                    583: .DS
                    584: [lip1+  si  li10>a]sa
                    585: 0si  lax
                    586: .DE
                    587: .SH
                    588: Push-Down Registers and Arrays
                    589: .PP
                    590: These commands were designed for used by a compiler, not by
                    591: people.
                    592: They involve push-down registers and arrays.
                    593: In addition to the stack that commands work on, DC can be thought
                    594: of as having individual stacks for each register.
                    595: These registers are operated on by the commands \fBS\fP and \fBL\fP.
                    596: \fBS\fIx\fR pushes the top value of the main stack onto the stack for
                    597: the register \fIx\fP.
                    598: \fBL\fIx\fR pops the stack for register \fIx\fP and puts the result on the main
                    599: stack.
                    600: The commands \fBs\fP and \fBl\fP also work on registers but not as push-down
                    601: stacks.
                    602: \fBl\fP doesn't effect the top of the
                    603: register stack, and \fBs\fP destroys what was there before.
                    604: .PP
                    605: The commands to work on arrays are \fB:\fP and \fB;\fP.
                    606: \fB:\fIx\fR pops the stack and uses this value as an index into
                    607: the array \fIx\fP.
                    608: The next element on the stack is stored at this index in \fIx\fP.
                    609: An index must be greater than or equal to 0 and
                    610: less than 2048.
                    611: \fB;\fIx\fR is the command to load the main stack from the array \fIx\fP.
                    612: The value on the top of the stack is the index
                    613: into the array \fIx\fP of the value to be loaded.
                    614: .SH
                    615: Miscellaneous Commands
                    616: .PP
                    617: The command \fB!\fP interprets the rest of the line as a 
                    618: .UX 
                    619: command and passes it to 
                    620: .UX
                    621: to execute.
                    622: One other compiler command is \fBQ\fP.
                    623: This command uses the top of the stack as the number of levels of recursion to skip.
                    624: .SH
                    625: DESIGN CHOICES
                    626: .PP
                    627: The real reason for the use of a dynamic storage allocator was
                    628: that a general purpose program could be (and in fact has been)
                    629: used for a variety of other tasks.
                    630: The allocator has some value for input and for compiling (i.e.
                    631: the bracket [...] commands) where it cannot be known in advance
                    632: how long a string will be.
                    633: The result was that at a modest
                    634: cost in execution time, all considerations of string allocation
                    635: and sizes of strings were removed from the remainder of the program
                    636: and debugging was made easier.  The allocation method
                    637: used wastes approximately 25% of available space.
                    638: .PP
                    639: The choice of 100 as a base for internal arithmetic
                    640: seemingly has no compelling advantage.  Yet the base cannot
                    641: exceed 127 because of hardware limitations and at the cost
                    642: of 5% in space, debugging was made a great deal easier and
                    643: decimal output was made much faster.
                    644: .PP
                    645: The reason for a stack-type arithmetic design was
                    646: to permit all DC commands from addition to subroutine execution
                    647: to be implemented in essentially the same way.  The result
                    648: was a considerable degree of logical separation of the final
                    649: program into modules with very little communication between
                    650: modules.
                    651: .PP
                    652: The rationale for the lack of interaction between the scale and the bases
                    653: was to provide an understandable means of proceeding after
                    654: a change of base or scale when numbers had already been entered.
                    655: An earlier implementation which had global notions of
                    656: scale and base did not work out well.
                    657: If the value of
                    658: .ft B
                    659: scale
                    660: .ft
                    661: were to be interpreted in the current
                    662: input or output base,
                    663: then a change of base or scale in the midst of a
                    664: computation would cause great confusion in the interpretation
                    665: of the results.
                    666: The current scheme has the advantage that the value of
                    667: the input and output bases
                    668: are only used for input and output, respectively, and they
                    669: are ignored in all other operations.
                    670: The value of
                    671: scale
                    672: is not used for any essential purpose by any part of the program
                    673: and it is used only to prevent the number of
                    674: decimal places resulting from the arithmetic operations from
                    675: growing beyond all bounds.
                    676: .PP
                    677: The design rationale for the choices for the scales of
                    678: the results of arithmetic were that in no case should
                    679: any significant digits be thrown away if, on appearances, the
                    680: user actually wanted them.  Thus, if the user wants
                    681: to add the numbers 1.5 and 3.517, it seemed reasonable to give
                    682: him the result 5.017 without requiring him to unnecessarily
                    683: specify his rather obvious requirements for precision.
                    684: .PP
                    685: On the other hand, multiplication and exponentiation produce
                    686: results with many more digits than their operands and it
                    687: seemed reasonable to give as a minimum the number of decimal
                    688: places in the operands but not to give more than that
                    689: number of digits
                    690: unless the user asked for them by specifying a value for \fBscale\fP.
                    691: Square root can be handled in just the same way as multiplication.
                    692: The operation of division gives arbitrarily many decimal places
                    693: and there is simply no way to guess how many places the user
                    694: wants.
                    695: In this case only, the user must
                    696: specify a \fBscale\fP to get any decimal places at all.
                    697: .PP
                    698: The scale of remainder was chosen to make it possible
                    699: to recreate the dividend from the quotient and remainder.
                    700: This is easy to implement; no digits are thrown away.
                    701: .SH
                    702: References
                    703: .IP [1]
                    704: L. L. Cherry, R. Morris,
                    705: .ft I
                    706: BC \- An Arbitrary Precision Desk-Calculator Language.
                    707: .ft
                    708: .IP [2]
                    709: K. C. Knowlton,
                    710: .ft I
                    711: A Fast Storage Allocator,
                    712: .ft
                    713: Comm. ACM \fB8\fP, pp. 623-625 (Oct. 1965).

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.