/[dtapublic]/pubs/books/ucbka/trunk/c_cil0/c_cil0.tex
ViewVC logotype

Annotation of /pubs/books/ucbka/trunk/c_cil0/c_cil0.tex

Parent Directory Parent Directory | Revision Log Revision Log


Revision 4 - (hide annotations) (download) (as text)
Thu Oct 6 03:15:02 2016 UTC (8 years, 2 months ago) by dashley
File MIME type: application/x-tex
File size: 115608 byte(s)
Initial commit after migrating from CVS.
1 dashley 4 %$Header: /home/dashley/cvsrep/e3ft_gpl01/e3ft_gpl01/dtaipubs/esrgubka/c_cil0/c_cil0.tex,v 1.24 2003/11/03 02:14:24 dtashley Exp $
2    
3     \chapter[\ccilzeroshorttitle{}]{\ccilzerolongtitle{}}
4    
5     \label{ccil0}
6    
7     \beginchapterquote{``If our ancestors had invented arithmetic by counting with
8     their two fists or their eight fingers, instead of their
9     ten `digits', we would never have to worry about
10     writing binary-decimal conversion routines.
11     (And we would perhaps never have learned as much about
12     number systems.)''}
13     {Donald E. Knuth, \cite[p. 319]{bibref:b:knuthclassic2ndedvol2}}
14    
15     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
16     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
17     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
18     \section{Introduction}
19     %Section tag: INT0
20     \label{ccil0:sint0}
21    
22     Low-cost microcontrollers have no support for floating-point arithmetic,
23     and so integer arithmetic and fixed-point arithmetic are used nearly exclusively
24     in embedded systems. The ability to implement integer arithmetic
25     economically is a critical skill in the development of embedded
26     systems.
27    
28     Integer arithmetic algorithms are critically important in embedded
29     systems for the following reasons:
30    
31     \begin{itemize}
32     \item Mistakes in the implementation of arithmetic are frequently
33     responsible for product problems. (Mistakes are not confined
34     to obvious errors---errors such as filters which do not converge
35     on their input are also responsible for product problems.)
36     \item Floating-point arithmetic is not available or ill-advised
37     for nearly all small embedded systems for the following reasons:
38     \begin{itemize}
39     \item Low-cost microcontrollers do not possess hardware support for
40     floating-point arithmetic.
41     \item Implementation of floating-point arithmetic in software is
42     computationally expensive.
43     \item Implementation of floating-point arithmetic in software may
44     require large floating-point libraries, typically consuming
45     1K-4K of ROM.
46     \item Safety-critical software standards typically prohibit the
47     use of floating-point arithmetic.
48     \end{itemize}
49     \item Integer arithmetic algorithms (other than addition and subtraction)
50     are quite tedious and error-prone for a software developer to design, implement, and
51     unit test. The implementation of such algorithms represents
52     cost and risk. Cost and risk benefits are achieved if the algorithms in detail are
53     available in advance (thus precluding design activities), or
54     better yet if ready-to-use integer algorithm libraries are available.
55     \end{itemize}
56    
57     This chapter describes the more fundamental principles and algorithms
58     (representation, fixed-point arithmetic, treatment of overflow, comparison,
59     addition, subtraction, multiplication, and division). A section
60     (Section \ref{ccil0:smim0}) is also included
61     on miscellaneous mappings involving integers which
62     are not numerical in intent.
63     Chapter %\cdtazeroxrefhyphen\cdtazerovolarabic{}
64     TBD
65     describes more complicated
66     integer algorithms and techniques (discrete-time operations
67     such as filtering, integration, and differentiation as well as more
68     complex functions such as square root). The split between these two chapters
69     is arbitrary; and in fact the material could have been divided differently
70     or combined.
71    
72     Treatment of the topics in this chapter is largely in accordance with
73     Knuth \cite{bibref:b:knuthclassic2ndedvol2}. The principal issues in
74     the implementation of integer algorithms are:
75    
76     \begin{itemize}
77     \item \textbf{How to use the arithmetic [or other] instructions provided by the machine to
78     operate on larger operands.} Microcontrollers typically provide arithmetic
79     instructions (comparison, shifting, addition, subtraction, and often but not
80     always multiplication and/or division) that operate on 8-bit or 16-bit integers.
81     A key question
82     is how small-operand instructions ``scale up''---that is, if and how they can
83     be used to assist in the implementation of integer arithmetic for much larger
84     operands.
85     \item \textbf{The order of the algorithm involved.} The order of algorithms
86     is a complicated issue when applied to microcontroller work. Many sophisticated
87     algorithms have a breakpoint below which they are less economical than
88     an inferior algorithm. Some applications (such as generating cryptographic keys
89     when integers thousands of bits long must be tested for primality) will
90     benefit from sophisticated algorithms becuase the operand sizes are large enough
91     to pass any such breakpoints. However, in microcontroller work, the need to manipulate
92     integers longer than 64 bits is very rare; thus, the breakpoints that indicate the
93     use of more sophisticated algorithms may not be reached. In microcontroller work,
94     depending on the operand sizes, there are circumstances in which an
95     $O(n^2)$ algorithm may be preferable to an $O(\log n)$ algorithm. Generally,
96     the order of algorithms must be balanced against operand sizes.
97     \end{itemize}
98    
99     We do diverge from Knuth in some areas. The most prominent divergence is
100     in the proofs offered for some important theorems and lemmas. Knuth
101     employs contrapositive proof formats in many circumstances, whereas we prefer
102     to use linear proofs that are more understandable to engineers and microcontroller
103     software developers.
104    
105     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
106     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
107     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
108     \section[Paradigms And Principles]
109     {Paradigms And Principles Of Microcontroller Arithmetic}
110     %Section tag: PPM0
111     \label{ccil0:sppm0}
112    
113     How should one think about microcontroller arithmetic? What principles
114     guide us in its design and implementation? In this section,
115     we provide some general principles and paradigms of thought.
116    
117    
118     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
119     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
120     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
121     \subsection{Microcontroller Arithmetic As An Accident Of Silicon Design}
122     %Subsection tag: MAS0
123     \label{ccil0:sppm0:smas0}
124    
125     In chapters
126     \cfryzeroxrefhyphen{}\ref{cfry0},
127     \ccfrzeroxrefhyphen{}\ref{ccfr0},
128     and
129     \cratzeroxrefhyphen{}\ref{crat0}
130     we consider rational approximation,
131     both in the form $h/k$ and $h/2^q$. Both forms of rational approximation
132     tend to be effective because we know that all modern processors possess
133     shift instructions, most possess integer multiply instructions, and many
134     possess integer divide instructions. In other words, the design
135     of the machine instruction set drives the strategies for implementation
136     of arithmetic, and makes some strategies attractive.
137    
138     Similarly, the observation that all microcontrollers provide instructions
139     for integer arithmetic creates the attractiveness of fixed-point arithmetic.
140    
141     Thus, we might view our approaches to microcontroller arithmetic as
142     an ``accident'' of silicon design, or as being driven by silicon
143     design.
144    
145     Generally, we seek to determine the best way to use the primitive
146     operations provided by the machine (the instruction set) to
147     accomplish the mappings of interest.
148    
149     The ``classic'' algorithms
150     presented by Knuth
151     Knuth (\cite[pp. 265-284]{bibref:b:knuthclassic2ndedvol2}) are especially
152     designed to use the ``small'' addition, subtraction, multiplication, and
153     division provided by the machine to add, subtract, multiply, and divide arbitrarily
154     large integers. In
155     \cite[pp. 265-266]{bibref:b:knuthclassic2ndedvol2}) Knuth writes:
156    
157     \begin{quote}
158     \emph{The most important fact to understand about extended-precision numbers
159     is that they may be regarded as numbers written in radix-$w$ notation,
160     where $w$ is the computer's word size. For example, an integer that
161     fills 10 words on a computer whose word size is $w=10^{10}$ has 100
162     decimal digits; but we will consider it to be a 10-place number to
163     the base $10^{10}$. This viewpoint is justified for the same reason
164     that we may convert, say, from binary to hexadecimal notation,
165     simply by grouping the bits together.}
166    
167     \emph{In these terms, we are given the following primitive operations to work with:}
168    
169     \begin{itemize}
170     \item \emph{a$_0$) addition or subtraction of one-place integers, giving a one-place
171     answer and a carry;}
172     \item \emph{b$_0$) multiplication of a one-place integer by another one-place integer,
173     giving a two place answer;}
174     \item \emph{c$_0$) division of a two-place integer by a one-place integer,
175     provided that the quotient is a one-place integer, and yielding
176     also a one-place remainder.}
177     \end{itemize}
178    
179     \noindent{}\emph{By adjusting the word size, if necessary, nearly all computers
180     will have these three operations available; so we will construct algorithms
181     (a), (b), and (c) mentioned above in terms of the primitive operations
182     (a$_0$), (b$_0$), and (c$_0$).}
183    
184     \emph{Since we are visualizing extended-precision integers as base $b$ numbers, it is
185     sometimes helpful to think of the situation when $b = 10$, and to imagine
186     that we are doing the arithmetic by hand. Then operation (a$_0$) is analogous
187     to memorizing the addition table; (b$_0$) is analogous to memorizing the
188     multiplication table, and (c$_0$) is essentially memorizing the multiplication
189     table in reverse. The more complicated operations (a), (b), (c) on
190     high-precision numbers can now be done using simple addition, subraction,
191     multiplication, and long-division procedures that children are taught
192     in elementary school.}
193     \end{quote}
194    
195     The critical issue for implementation of integer arithmetic with large operands
196     is how to use small-operand instructions to operate on larger operands---in other words,
197     how to ``scale up'' the capability provided by the instruction set.
198    
199    
200     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
201     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
202     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
203     \subsection{Microcontroller Arithmetic As A Mapping From Quantized Domain To
204     Quantized Range}
205     %Subsection tag: MAM0
206     \label{ccil0:sppm0:smam0}
207    
208     Microcontroller software accepts inputs which are quantized. In nearly all cases,
209     this involves a mapping from $\vworkrealset$ to $\vworkintset$. Often, because
210     microcontroller products are optimized for cost, the quantization hardware
211     delivers quite poor precision, frequently less than 8 bits.
212    
213     When a quantized input is accepted, it defines an inquality. Knowledge of
214     the quantized input (an integer) confines the actual input (a real
215     number, before
216     quantization) to an interval. With a low-cost hardware design, the
217     interval can be fairly large. Usually, by adding cost, the
218     interval can be made smaller.
219    
220     Microcontroller outputs tend to be quantized as well, so it is
221     accurate to also characterize outputs as integers. For example, a PWM signal
222     generated by a microcontroller or the output of a D/A converter is
223     controlled by data that is an integer. Like inputs, often the ``granularity''
224     with which outputs can be controlled is quite coarse---again, 8 bits or
225     less is not uncommon.
226    
227     Thus, we may view microcontroller software as a mapping from poor-quality
228     inputs to poor-quality outputs.
229    
230     In such a framework, where the nature of inputs and outputs introduces
231     substantial error, it is imperative not to introduce additional error
232     in computer arithmetic. In other words, given inputs which are
233     integers, the responsibility of the software is to choose the best
234     integers as outputs. Usually this means that calculations should be
235     devised so as not to lose any information (i.e.
236     not to lose remainders, for example). Losing information is usually
237     equivalent to not being able to make the most correct mapping from input
238     to output. ``Lossy'' arithmetic can degrade the performance of a system,
239     since poor arithmetic may compound an inexpensive hardware design.
240    
241    
242     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
243     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
244     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
245     \subsection{Microcontroller Arithmetic As A Simulation Of Continuous Controllers}
246     %Subsection tag: MAE0
247     \label{ccil0:sppm0:smae0}
248    
249     Control systems have not always employed digital controllers.
250     Many books and web sites (see \cite{bibref:w:historycontrol01}, for example)
251     discuss the historical development of feedback control. Controllers
252     have not historically been digital, or even electronic.
253     Early controllers for governing steam devices or windmills were
254     ultimately mechanical, and relied upon inertia or other physical
255     properties. It is possible to realize abstract notions
256     (integrators, differentiators, gains) using hydraulic systems or other mechanical systems;
257     and in fact hydraulic feedback controllers were used in early rockets
258     and aircraft. Very naturally, abstract notions (integrators,
259     differentiators, gains) can be implemented using analog
260     electronic components. The most common implementations involve
261     operational amplifiers, and the behavior of such implementations comes
262     very close to the ideal mathematical models.
263    
264     Mechanical, hydraulic, and non-digital electronic controllers have
265     one very desirable characteristic---\emph{clipping}. If, for example,
266     one provides an analog differentiator with a $dV/dt$ which
267     is too large, the output that the differentiator can
268     provide is limited, usually by the supply voltage available to an operational
269     amplifier.
270     The differentiator \emph{must} clip.
271    
272     Clipping often leads to behavior which is close to what
273     intuition would expect (i.e. we would present
274     clipping as an occasional advantage). For example, if an input to
275     an analog control system suffers a failure, the behavior
276     the of the controller is limited, as is its internal
277     state. Similarly, when the
278     input is restored, the controller will usually recover
279     in a reasonable time because the
280     state of the controller (typically maintained in capacitors) is limited
281     in the magnitude it can attain.
282    
283     We might view a digital controller as an emulation of
284     an analog controller. We may want to cause the
285     controller to have limits (i.e. rails) internally, for
286     example to prevent excessive integrator ``windup''. We discuss
287     this further in Section \ref{ccil0:sode0}.
288    
289    
290     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
291     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
292     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
293     \section{Practical Design Issues}
294     %Section tag: PDI0
295     \label{ccil0:spdi0}
296    
297     In this section, we consider practical issues surrounding the design
298     and construction of a set of integer arithmetic subroutines.
299     In practice, such a collection of subroutines is likely to be
300     arranged into a library. The purpose of the library would be to
301     free the clients (or callers) of the library from the complexity of
302     large integer calculations.
303    
304     The design decisions surrounding the construction of a library vary in
305     the objectivity with which they can be approached. Some design decisions
306     (such as the best mechanism for passing parameters) can be approached
307     rigorously because the measures of goodness are unequivocal (minimal ROM consumption
308     or execution time, for example). However, other design decisions, particulary the
309     decision of the exact nature of the interface between an arithmetic library and
310     its clients, are more subjective. One size does \emph{not} fit all.
311    
312    
313     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
314     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
315     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
316     \subsection{Parameter Passing And Temporary Storage Mechanisms}
317     %Subsection tag: PPM0
318     \label{ccil0:spdi0:sppm0}
319    
320     In small microcontroller work, the desire to save ROM and execution time
321     may lead to inelegant software construction. Because an arithmetic library
322     used in microcontroller work may be called from many different places
323     throughout ROM, serious thought should be given to optimizing the
324     parameter passing mechanisms, even perhaps at the expense of elegance.
325     The way in which the arithmetic library allocates temporary storage is
326     also a point of concern, because the most elegant way of allocating temporary
327     storage (on the stack) may either not be feasible (because of the possibility
328     of stack overflow) or may not be efficient (because the addressing modes of
329     the machine make data on the stack inefficient to address). In this section
330     we discuss both parameter passing and temporary storage mechanisms.
331    
332     In the remainder of the discussion, we make the following assumptions
333     about software architecture.
334    
335     \begin{enumerate}
336     \item \textbf{The arithmetic library need not be re-entrant.}
337     Most ``small'' microcontroller software loads use a non-preemptive
338     scheduling paradigm, so this is a reasonable assumption. We also
339     make the reasonable assumption that ISR's may not make calls into
340     the arithmetic library.
341     \item \textbf{Dynamic memory allocation, other than on the stack,
342     is not allowed by the software architecture.} This is also
343     a reasonable assumption in ``small'' microcontroller software.
344     \end{enumerate}
345    
346     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
347     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
348     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
349     \subsubsection{Parameter Passing Mechanisms}
350     %Subsubsection tag: PPM0
351     \label{ccil0:spdi0:sppm0:sppm0}
352    
353     If an arithmetic library exists in a microcontroller software load,
354     it may be called many times throughout ROM. Thus, the parameter
355     passing mechanisms chosen may have a large effect on ROM consumption
356     (due to the setup required for each subroutine call multiplied by
357     many instances throughout ROM) and execution time
358     (because in microcontroller software longer instructions nearly always
359     require more time). Because of the criticality of ROM consumption,
360     parameter passing mechanisms that lack elegance may be attractive.
361    
362     In the category of parameter passing, we also include the way in which
363     return value(s) are passed back to the caller.
364    
365     The following parameter-passing mechanisms may be employed:
366    
367     \begin{enumerate}
368     \item \textbf{Pass by value as storage class \emph{automatic}.}
369     The most common scenario is that the arithmetic
370     library is written in assembly-language to be called from
371     `C', and so the assembly-language subroutines must adhere to the
372     parameter-passing conventions used by the compiler.
373     This usually means that the entire input or output value
374     will be passed in CPU registers or on the stack. Somewhat rarely,
375     a compiler will pass parameters in static locations.\footnote{The
376     usual reason for a `C' compiler to pass parameters in static locations
377     is because the instruction set of the machine was not designed for
378     higher-level languages, and references to [usually \emph{near}] memory
379     are cheaper than stack references. Such compilers also typically
380     analyze the calling tree of the program where possible and use this
381     information to overlay the parameter-passing memory areas of
382     subroutines that cannot be active simultaneously. Without the ability
383     to analyze the calling tree and make overlay decisions based on it,
384     memory would be exhausted, because each subroutine would need to have its
385     own static storage for parameters and local variables.}
386     \item \textbf{Pass by reference.}
387     Typically, it is convenient to pass pointer(s) to area(s) of memory
388     containing input operands, and also a pointer to an area of memory
389     owned by the caller which is written with the result by the arithmetic subroutine.
390     The efficiency of this approach depends on the compiler and the instruction
391     set of the machine. If the instruction set of the machine cannot
392     make effective use of pointers or stack frames, an arithmetic subroutine
393     might be constructed so that it first copies the operands to a static area of memory
394     reserved for the arithmetic library, then performs the necessary arithmetic
395     operations on the operands in the static area,
396     then copies the result(s) back to the area owned by the caller.
397     \item \textbf{Pass by common data block.}
398     In some cases, it may be preferable to reserve a block of memory in which to
399     pass parameters to arithmetic library functions, and from which to retrieve
400     results after an arithmetic library function returns. The allocation of such
401     a static memory block may be done manually\footnote{Note to self: need to
402     include gentleman's agreements on memory usage in my note on software architecture.}
403     or automatically (by development tools which can analyze the function calling tree and
404     manage the overlaying).
405     \end{enumerate}
406    
407    
408    
409     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
410     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
411     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
412     \subsubsection{Temporary Storage Mechanisms}
413     %Subsubsection tag: TSM0
414     \label{ccil0:spdi0:sppm0:stsm0}
415    
416     Need to indicate clearly on section on software architectures the
417     primary temporary storage mechanisms:
418    
419     \begin{itemize}
420     \item Stack.
421     \item Memory block with overlay functionality.
422     \end{itemize}
423    
424     Need to expand software architecture section to cover this, so don't
425     discuss here.
426    
427    
428     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
429     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
430     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
431     \subsection{Reporting Of Overflow, Underflow, And Domain Errors}
432     %Subsection tag: OUD0
433     \label{ccil0:spdi0:soud0}
434    
435     Long integer data types used in microcontroller work are typically
436     of a static size (they cannot grow in size in as operations are
437     performed on them). The reason for the typical static sizes is that
438     dynamic allocation (except for allocation and
439     deallocation on the stack as subroutines
440     are called and return) is rarely used in small microcontroller work.
441     It will come about in the normal usage of an integer arithmetic
442     library that an attempt will be made to operate on integers in
443     a way which generates an overflow, generates an
444     underflow, or
445     represents a domain error (division by zero or
446     square root of a negative integer, for example).
447     An important design decision is how such normal exceptions should be
448     handled.
449    
450     Possible design decisions in this area are:
451    
452     \begin{enumerate}
453     \item \label{enum:ccil0:spdi0:soud0:01:01}
454     \textbf{To design arithmetic subroutines so that exceptions are not
455     possible.}
456     For example, multiplying an $m$-word integer by an $n$-word integer
457     will always generate an integer that will fit within $m+n$ words.
458     If a multiplication subroutine is designed so that the caller must
459     provide an $m$-word operand and an $n$-word operand and a pointer to
460     an $(m+n)$-word area of memory for the result, an overflow cannot occur.
461     Such a design decision essentially pushes overflow detection back up to
462     the callers of arithmetic subroutines.
463     \item \label{enum:ccil0:spdi0:soud0:01:02}
464     \textbf{To design arithmetic subroutines so that exceptions are possible,
465     but not to detect the exceptions, thus providing an implementation that
466     will produce incorrect results with some operand data values.}
467     For example, if an arithmetic subroutine is designed to add an $m$-word
468     operand to another $m$-word operand to produce an $m$-word result, overflow
469     is possible. A design decision to fail to detect such exceptions pushes
470     the responsibility up to the callers of the arithmetic subroutines.
471     Callers must devise a method for not calling arithmetic subroutines
472     with data values that will cause an exception, or else to detect an exception
473     when it has occurred.
474     \item \label{enum:ccil0:spdi0:soud0:01:03}
475     \textbf{To ``rail'' the result in response to an exception.}
476     It was stated earlier that analog control system functional blocks
477     built with operational
478     amplifiers typically have an output which cannot go beyond the
479     supply rails. One may implement similar behavior in arithmetic subroutines.
480     In an addition subroutine which adds two $m$-word operands to produce an
481     $m$-word result (with each word having $w$ bits), it would be natural to
482     return $2^{mw}-1$ in the event of an overflow in a positive direction and
483     $-2^{mw}$ in the event of an overlfow in a negative direction. Note that
484     the caller will not be able to distinguish a ``rail'' value which represents
485     a valid result from a ``rail'' value substituted to indicate an exception.
486     \item \label{enum:ccil0:spdi0:soud0:01:04}
487     \textbf{To reserve special result data values to indicate exceptions.}
488     Depending on the arithmetic subroutine being implemented, it may be possible
489     to reserve certain result data values to indicate exceptions. This approach
490     is often awkward, as most mathematical subroutines are naturally defined so that
491     all bit patterns in the memory reserved for the result are valid numbers.
492     Additionally, with long result data values, it may not be economical to
493     compare the result against the reserved exception values. Thus, this is seldom
494     an optimal way to deal with exceptions.
495    
496     Additionally, if this approach is employed, the semantics of how exception
497     values combine with other exception values and data values must be decided.
498     \item \label{enum:ccil0:spdi0:soud0:01:05}
499     \textbf{To return exception codes to the caller separate from the result data.}
500     In the `C' language, pointers are often used to supply an arithmetic subroutine
501     with the input operands and to provide the arithmetic subroutine with a location
502     (which belongs to the caller) in which to store the result data. Thus, the return
503     value of the arithmetic subroutine (normally assigned through the subroutine name)
504     is often available to return exception codes. For example,
505     a `C' function may be defined as
506    
507     \begin{verbatim}
508     unsigned char int128_add(INT128 *result,
509     INT128 *arg1,
510     INT128 *arg2),
511     \end{verbatim}
512    
513     leaving the returned \texttt{unsigned char} value available to return
514     exception information. Note that this arrangement has the following advantages:
515    
516     \begin{enumerate}
517     \item All bit patterns in the result data memory area area available
518     as data bit patterns.
519     \item The exception data is very economical to test, because it is placed
520     in a machine-native data type.
521     \item The exception data can easily be discarded or by the caller if desired.
522     \item All decisions about how to handle exceptions are left to the caller.
523     \end{enumerate}
524     \item \label{enum:ccil0:spdi0:soud0:01:06}
525     \textbf{To maintain exception data with each result integer.}
526     It is possible to reserve bits for exception information which are part of the
527     long integer data type. This exception state essentially conveys
528     \emph{NaN}\footnote{\emph{N}ot \emph{a} \emph{n}umber.} information---integers with
529     exception information set are not true numbers, but rather they are different from the
530     true result in some way. As with (\ref{enum:ccil0:spdi0:soud0:01:04}), the
531     semantics of how to combine NaN values and NaN values with ordinary non-NaN numbers
532     must be defined.
533     \item \label{enum:ccil0:spdi0:soud0:01:07}
534     \textbf{To maintain a global exception state variable.}
535     A variable or set of variables can be reserved which hold the
536     exception information, if any, from the most recent call to
537     a function in the arithmetic library.
538    
539     To save CPU cycles, the arithmetic library can
540     be designed so that it will assign the global exception state variable only if an
541     exception occurs---the caller then has the responsibility of clearing the exception
542     state variable before making any call into the arithmetic library where the
543     exception result is of interest. The interface between the caller and the library
544     can be further optimized if the library only OR's data into the variable containing
545     the exception state. Using this optimization, the caller can clear the exception state
546     variable, make several calls into the arithmetic library, and then retrieve a meaningful
547     exception state variable value summarizing several arithmetic operations.
548     \item \label{enum:ccil0:spdi0:soud0:01:08}
549     \textbf{Hybrid approaches.}
550     The approaches (\ref{enum:ccil0:spdi0:soud0:01:01})
551     through (\ref{enum:ccil0:spdi0:soud0:01:07}) can be combined.
552     For example, approach (\ref{enum:ccil0:spdi0:soud0:01:03})
553     might be combined with approach (\ref{enum:ccil0:spdi0:soud0:01:05})
554     so that exceptions are ``railed'', but the caller may also be made
555     aware that an exception has occured. Many hybrid approaches are possible.
556     \end{enumerate}
557    
558    
559     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
560     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
561     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
562     \subsection{Semantics Of Combining Overflow, Underflow, And Domain Errors}
563     %Subsection tag: CMB0
564     \label{ccil0:spdi0:scmb0}
565    
566     For control system arithmetic, some form of clipping as suggested
567     in Section \ref{ccil0:sppm0:smae0} is probably the
568     best approach. Definitely, an overflow should generate a result
569     which is the largest representable integer, and an
570     underflow should generate a result which is the smallest
571     representable integer.
572    
573     In addition to treating an overflow by clipping, it may be
574     advantageous to reserve a flag in the representation of a
575     multiple-precision integer to record that an overflow has occured and been clipped.
576     Some functions which accept the integer as input may be interested
577     in the value of such a flag, where othere---perhaps most---may
578     not.
579    
580     The correct course of action in the event of a domain error (such
581     as division by zero) is less clear. It is noteworthy that in a
582     normal control system, domain errors cannot occur (but overflows
583     can).
584    
585     The best approach when a domain error is involved probably
586     depends on the basis for the underlying calculation. For
587     example, if integer division is used as part of a
588     strategy for software ratiometric conversion, a value
589     of zero in the denominator probably represents extreme electrical
590     noise, and the most sane approach may be to replace the
591     denominator by one. However, in other contexts it may be appropriate
592     to think in terms of
593    
594     \begin{equation}
595     \lim_{k \rightarrow 0^+} \frac{kn}{kd}
596     \end{equation}
597    
598     \noindent{}or
599    
600     \begin{equation}
601     \lim_{k \rightarrow 0^-} \frac{kn}{kd} .
602     \end{equation}
603    
604     Put in other terms, there is not a clear ``one solution
605     meets all needs'' approach to dealing with domain
606     errors.
607    
608     As in the case of overflows, it may be advantageous to reserve a bit
609     flag to signal that a domain error has occured and that the result
610     is not valid or not reliable. Note that floating point chips
611     (such as the 80x87) provide similar indications of domain errors.
612    
613     It may also be advantageous to adopt conventions for how
614     overflow or domain error flags propagate through binary or
615     unary operators. For example, if two numbers are multiplied, and
616     one of the two has the overflow flag set, it may be wise set the
617     overflow flag in the result. A scheme for how warning
618     flags propagate may be beneficial.
619    
620    
621     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
622     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
623     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
624     \subsection{Variable Versus Constant Subroutine Execution Time}
625     %Subsection tag: VVC0
626     \label{ccil0:spdi0:svvc0}
627    
628     As a design goal of an embedded system, we seek to minimize the
629     timing variability of software components. An arithmetic subroutine
630     that with a high probability takes a short time to execute and with a
631     low probability takes a long time to execute, and where the execution
632     time is data dependent, is a serious risk. An embedded software product
633     may pass all release testing, but then fail in the field because of
634     specific data values used in calculations.
635    
636     A very conservative design goal would be to design every arithmetic subroutine
637     to require exactly the same execution time, regardless of data values.
638     This goal is not practical because machine instructions themselves
639     usually have a variable execution time, particularly for multiplication
640     and division instructions. A fallback goal would be to avoid
641     large differences between minimum and maximum execution time, without
642     increasing the maximum execution time. A very practical step to take
643     (using division as an example)
644     is to insert artifical delays into easily detectable exception cases (such as
645     division by zero) so that the exception case takes as long as the
646     minimum time for a division with valid operands.
647    
648    
649     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
650     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
651     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
652     \section{Fixed-Point Arithmetic}
653     %Section tag: FPA0
654     \label{ccil0:sfpa0}
655    
656     \emph{Fixed-point arithmetic}\index{fixed-point arithmetic}
657     is a scheme for the representation
658     of engineering quantities (conceptually real numbers with optional
659     units) by integers so that calculations can be performed
660     on these quantitites using [usually multiple-precision]
661     integer arithmetic.
662    
663     In discussing fixed-point arithmetic,
664     we must be careful to distinguish between the
665     \emph{represented value} (the engineering quantity)
666     and the \emph{representation} (the integer which represents
667     the engineering quantity). In most cases, we must also
668     be careful to devise a system to track the units of the
669     represented values, as, especially with control systems,
670     the units of represented values (due to integration and
671     differentiation) can become very complex
672     and mistakes are easy to make.
673    
674     Fixed-point arithmetic is the dominant paradigm of construction
675     for calculations in small microcontroller systems. It may not be
676     clear why this should be so or what advantages it offers [over
677     floating-point arithmetic]. The reasons for
678     this predominance are:
679    
680     \begin{itemize}
681     \item Fixed-point calculations tend to be very efficient, because
682     they make direct use of the integer arithmetic instructions in the
683     microcontroller's instruction set. On the other hand, floating-point
684     arithmetic operations tend to be much slower.
685    
686     \item Floating-point calculations typically require a floating-point
687     library, which may consume at least several hundred bytes
688     of ROM.
689    
690     \item Some safety-critical software standards prohibit the use of
691     floating-point arithmetic because it can result in nebulous
692     behavior. Fixed-point arithmetic avoids these concerns.
693     \end{itemize}
694    
695     In order to carry out fixed-point arithmetic---that is, in order to
696     operate on engineering quantities as integers---we
697     require that the relationship between the
698     represented value and the representation be of the form
699    
700     \begin{equation}
701     \label{eq:ccil0:sfpa0:00}
702     x = r_I u + \Psi,
703     \end{equation}
704    
705     \noindent{}where $x \in \vworkrealset$ (possibly with units) is the represented
706     value, $u \in \vworkintset$ is the representation,
707     $r_I \in \vworkrealset$ is the scaling factor (possibly with
708     units), and $\Psi \in \vworkrealset$ (possibly with units) is the offset.
709     Note that the units of $r_I$, $\Psi$, and $x$ must match.
710    
711     We further require that $r_I \vworkdivides{} \Psi$\footnote{We \emph{are}
712     aware that this is an abuse of nomenclature, as
713     `$\vworkdivides$' (``divides'') is traditionally only applied to integers.}
714     (i.e. that $\Psi$ be an
715     integral multiple of $r_I$)
716     so that the offset in the represented value corresponds to an integer
717     in the representation. Without this restriction, we could not remove the
718     offset from the representation with integer subtraction only. Note that
719     we do \emph{not} require that $r_I$ or $\Psi$ be rational, although
720     they must both be rational or both be irrational in order to satisfy
721     (\ref{eq:ccil0:sfpa0:00}).
722    
723     In (\ref{eq:ccil0:sfpa0:00}), since we've required that $r_I \vworkdivides{} \Psi$,
724     we can replace $\Psi$ by
725    
726     \begin{equation}
727     \label{eq:ccil0:sfpa0:00b}
728     \psi = \frac{\Psi}{r_I}
729     \end{equation}
730    
731     \noindent{}to obtain
732    
733     \begin{equation}
734     \label{eq:ccil0:sfpa0:01}
735     x = r_I (u + \psi),
736     \end{equation}
737    
738     \noindent{}where $\psi \in \vworkintset$ is the offset in representational
739     counts.
740    
741     Note that we can also easily obtain the following relationships from the
742     defining equations (\ref{eq:ccil0:sfpa0:00}),
743     (\ref{eq:ccil0:sfpa0:00b}), and (\ref{eq:ccil0:sfpa0:01}).
744    
745     \begin{equation}
746     \label{eq:ccil0:sfpa0:02}
747     u = \frac{x - \Psi}{r_I} = \frac{x}{r_I} - \psi
748     \end{equation}
749    
750     \begin{equation}
751     \label{eq:ccil0:sfpa0:03}
752     \psi = \frac{\Psi}{r_I}
753     \Longleftrightarrow
754     \Psi = r_I \psi
755     \Longleftrightarrow
756     r_I = \frac{\Psi}{\psi}
757     \end{equation}
758    
759    
760     For example, in a 16-bit signed integer (which inherently may range
761     from -32768 to 32767 inclusive), one might used a fixed-point
762     representation of 100 integer counts per $^\circ$C ($r_I = 0.01 \; ^\circ$C)
763     with an offset of 100$^\circ$C ($\Psi$ = 100$^\circ$C or equivalently
764     $\psi$ = 10000), giving
765     a representational range from -227.68$^\circ$C to 427.67$^\circ$C inclusive.
766    
767     If $r_I = 2^N, \; N \in \vworkintset$, then the radix point of the represented
768     value is positioned
769     between two bits of the representation---this arrangement may have computational
770     advantages
771     if the whole and fractional parts of the represented value need to be separated
772     easily in the representation. Note also that if $r_I = 2^{WN}$ where $W$ is the
773     machine integer size of the computer (in bits), then the radix point of the represented value
774     occurs between two addressable machine integers of the representation, which can be convenient.
775     However, we do not require for our definition of a fixed-point representation that
776     $r_I$ be an integral power of two; and in fact we do not even require by our
777     definition that $r_I$ be rational. Note that in general our definition above is the
778     weakest set of conditions so that real-world engineering values can be manipulated
779     using integer operations performed upon the representation.
780    
781    
782     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
783     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
784     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
785     \section{Representation Of Integers}
786     %Section Tag: ROI0
787     \label{ccil0:sroi0}
788    
789     In this section, we discuss common representations of integers, both
790     \emph{machine} integers and \emph{synthetic long} integers.
791     By \emph{representation} we mean the mapping between the abstract
792     mathematical notion of an integer and the way it is stored in the computer
793     (voltage levels and the programming model).
794     Although
795     in Knuth's development of integer arithmetic
796     \cite{bibref:b:knuthclassic2ndedvol2}
797     it is assumed that
798     integers may be represented in any base, we don't require such generality
799     in practice and in this work we confine ourselves for the most
800     part to $b=2^n$, and often to $n = 8i$, $i \in \vworkintsetpos$. The assumption
801     of $b=2^n$ characterizes all modern digital computers, and we feel comfortable
802     making this assumption throughout the work. However, the assumption
803     $n = 8i$, $i \in \vworkintsetpos$ does not hold universally, and so we
804     most often do not make this assumption.
805    
806     By \emph{machine} integer, we mean an integer upon which the computer
807     can operate in a single instruction (such as to add, increment,
808     load, store, etc.). For most microcontrollers, machine integers are
809     either 8 or 16 bits in size. The representation of a machine integer
810     is designed and specified by the microcontroller manufacturer. In principle,
811     nothing would prevent a microcontroller manufacturer from devising
812     and implementing a novel way of representing machine integers and supporting
813     this novel representation with an instruction set. However, in
814     practice, all machine integers are either simple unsigned integers or two's
815     complement signed integers. In addition to the efficiency of these
816     representations with respect to the design of digital logic, these representations
817     are so standard and so pervasive that they are universally tacitly assumed.
818     For example, ``\texttt{if (i \& 0x1)}'' is an accepted C-language
819     idiom for ``if $i$ is odd'', and it is expected that such code will
820     work on all platforms.
821    
822     By \emph{synthetic long} integer, we mean an integer of
823     arbitrary\footnote{By \emph{arbitrary}, we do not necessarily mean that
824     the integer can grow to be arbitrarily large in magnitude, or that
825     its maximum size is not known at compile time. We mean \emph{arbitrarily}
826     longer than a machine integer. Multiple-precision arithmetic libraries
827     can be divided into two classes---those that fix the size of the integers
828     at compile time, and those that use dynamic allocation and allow integers to
829     grow as needed at run time. The former category
830     is normally used for small microcontroller work, whereas the latter category
831     (such as the GNU MP Library \cite{bibref:s:gnumultipleprecisionarithmeticlibrary})
832     is normally used in scientific and number theoretic calculation and on
833     more powerful platforms than microcontrollers. The representational concepts
834     we present here apply to both categories.}
835     length that is formed by concatenating machine integers. There is some
836     subjectivity in deciding the representation of multiple-precision integers,
837     and we discuss in the subsections
838     \ref{ccil0:sroi0:srou0} and
839     \ref{ccil0:sroi0:sros0} which immediately follow.
840    
841    
842     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
843     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
844     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
845     \subsection{Representation Of Unsigned Integers}
846     %Subsection Tag: ROU0
847     \label{ccil0:sroi0:srou0}
848    
849     Unsigned machine integers are always represented as an ordered
850     array of bits (Figure \ref{fig:ccil0:sroi0:srou0:00}). For an
851     $m$-bit unsigned integer $u$, we denote these bits $u_{[m-1]}$ through
852     $u_{[0]}$, with $u_{[m-1]}$ the most significant bit. The value
853     of $u$ is the sum of the values of each bit multiplied
854     by the power of 2 it represents:
855    
856     \begin{figure}
857     \centering
858     \includegraphics[width=4.6in]{c_cil0/uintrep1.eps}
859     \caption{Representation Of Unsigned Machine Integers}
860     \label{fig:ccil0:sroi0:srou0:00}
861     \end{figure}
862    
863     \begin{equation}
864     \label{eq:ccil0:sroi0:srou0:00}
865     u = \sum_{i=0}^{m-1} u_{[i]} 2^i .
866     \end{equation}
867    
868     In general, an $m$-bit unsigned integer can assume the values of
869     0 through $2^m - 1$, so that
870    
871     \begin{equation}
872     \label{eq:ccil0:sroi0:srou0:01}
873     u \in \{0, \ldots{} , 2^m - 1 \} .
874     \end{equation}
875    
876     Unsigned synthetic long integers are always represented as an array
877     of unsigned machine integers.
878     Consistent with the GMP \cite{bibref:s:gnumultipleprecisionarithmeticlibrary},
879     we call each element of the array a \emph{limb} and we call the size of
880     each limb the \emph{limbsize}. This usage is very close to what Knuth
881     calls the \emph{word}size $w$ in the excerpt presented in
882     Section \ref{ccil0:sppm0:smas0}.
883    
884     Microcontroller processors are more likely than more powerful processors to have
885     a non-orthogonal instruction set, and so the limbsize may not be consistent between
886     operations in an arithmetic library.
887     With some processors, the appropriate limbsize may vary depending on the operation being
888     performed.
889     For example, a microcontroller processor may be able to add two 16-bit integers to
890     obtain a 16-bit result plus a carry, but only be able to multiply two 8-bit integers to
891     obtain a 16-bit result (thus, the appropriate limbsize for addition may be
892     16 bits while the appropriate limbsize for multiplication may be 8 bits).
893     In such cases, it is usually most efficient to add using 16-bit limbs but
894     multiply using 8-bit limbs. Adding using 8-bit limbs on a machine which will
895     support 16-bit additions is not normally a good design decision---even if the
896     machine supports an 8-bit addition instruction which is faster than the 16-bit addition
897     instruction, $m/2$ 16-bit additions will nearly always be faster than
898     $m$ 8-bit additions. Using different limbsizes within the same arithmetic library
899     may require some consideration of alignment and
900     endian issues, but these are implementation details
901     which are easily solved.
902    
903     We view a synthetic long unsigned integer as an array of limbs (machine integers)
904     of some size, and we agree that we will not address the array in any other way than
905     by loading and storing limbs of this size.\footnote{Well \ldots{} not quite.
906     In software for large computers (personal computers and workstations) with an
907     orthogonal instruction set, we may be able to adhere to this rule. However,
908     with microcontrollers, arithmetic libraries which are optimized
909     may break this rule.} In particular, because
910     computers may be ``big-endian'' or ``little-endian'', loading and storing
911     smaller units than limbs may lead in
912     a worst case to software defects or in a best case to non-portable code.
913    
914     Assume that $w$ is the number of bits in a limb.
915     Notationally, we denote an unsigned
916     synthetic long integer as an array of $m$ limbs
917     $u_{m-1}$ through $u_0$, each containing $w$ bits,
918     with $u_0$ the least significant machine integer.
919     We may also define $b=2^w$ (consistent with Knuth's
920     notation).
921     The value of
922     such a synthetic long machine integer is
923    
924     \begin{equation}
925     \label{eq:ccil0:sroi0:srou0:02}
926     u = \sum_{i=0}^{m-1} u_{i} 2^{wi}
927     =
928     \sum_{i=0}^{m-1} u_{i} b^i.
929     \end{equation}
930    
931     As an alternative, we may write the value as the sum of the bit-values,
932    
933     \begin{equation}
934     \label{eq:ccil0:sroi0:srou0:03}
935     u = \sum_{i=0}^{wm-1} u_{[i]} 2^{i} .
936     \end{equation}
937    
938     Naturally, the range of such a synthetic long integer is
939    
940     \begin{equation}
941     \label{eq:ccil0:sroi0:srou0:04}
942     u \in \{0, \ldots{} , 2^{wm} - 1 \} .
943     \end{equation}
944    
945     In storing an unsigned synthetic long machine integer, the most natural way
946     to order the array of limbs depends on whether dynamic memory allocation is
947     used by the arithmetic library. In microcontroller work, where arithmetic
948     library subroutines typically operate on fixed-size operands and produce
949     fixed-size results, storing
950     limbs most significant limb first (i.e. in `C', so that element \texttt{[0]}
951     of the array of limbs contains the most significant limb) may be natural
952     and convenient. However, this ordering would lead to computational waste in a library such
953     as the GMP \cite{bibref:s:gnumultipleprecisionarithmeticlibrary} where integers
954     may grow arbitrarily large and the library may need to reallocate long synthetic
955     integers to contain more limbs, as each reallocation would need to be followed
956     by a memory copy to align the integer's existing limbs to the end of the array.
957     For libraries such as the GMP, it is more practical to store limbs
958     least-significant limb first, as it eliminates the need to copy memory
959     when reallocations are done.
960    
961    
962    
963     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
964     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
965     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
966     \subsection{Representation Of Signed Integers}
967     %Subsection Tag: ROS0
968     \label{ccil0:sroi0:sros0}
969    
970     Signed machine integers are always represented in two's complement form on modern
971     processors. This representation is universal because of the digital logic
972     conveniences---the same addition and subtraction mappings which are correct
973     for unsigned machine integers are also correct for signed machine integers,
974     although the criteria for overflow and comparison are
975     different.
976    
977     Most readers are familiar with two's complement representation, so we will not
978     belabor it. However, we will present essential properties.
979     When two's complement representation is used in an $m$-bit machine integer $u$:
980    
981     \begin{enumerate}
982     \item All bit patterns with $u_{[m-1]} = 0$ represent non-negative integers, and
983     represent the same integer as if the representation were unsigned.
984     \item All bit patterns with $u_{[m-1]} = 1$ represent negative numbers; specifically
985     $u_{[m-2:0]} - 2^{m-1}$; i.e.
986    
987     \begin{equation}
988     \label{eq:ccil0:sroi0:sros0:00}
989     u = - u_{[m-1]} 2^{m-1} + \sum_{i=0}^{m-2} u_{[i]} 2^i .
990     \end{equation}
991    
992     \item $u \in \{-2^{m-1}, \ldots{}, 2^{m-1}-1 \}$.
993     \item All bit patterns represent a unique integer.
994     \item For any integer except $-2^{m-1}$,
995     negation can be performed by forming the one's complement (complementing
996     every bit), then adding one. To see why this is true algebraically, note that
997    
998     \end{enumerate}
999    
1000    
1001     However, let us observe that the value of an
1002     $m$-bit two's complement
1003     machine integer is
1004    
1005    
1006     In general, an $m$-bit signed machine integer can assume the values of
1007     $-2^{m-1}$ through $2^{m-1} - 1$, so that
1008    
1009     \begin{equation}
1010     \label{eq:ccil0:sroi0:sros0:01}
1011     u \in \{-2^{m-1}, \ldots{} , 2^{m-1} - 1 \} .
1012     \end{equation}
1013    
1014     There are [at least] two different representations of signed
1015     multiple-precision integers:
1016    
1017     \begin{itemize}
1018     \item Two's complement representation.
1019     \item Sign-magnitude representation.
1020     \end{itemize}
1021    
1022     There are two different representations commonly used
1023     for signed multiple-precision integers because two's complement
1024     representation is not ideal for multiplication and division, although
1025     it is ideal for addition and subtraction. For multiple-precision
1026     integer arithmetic, sign-magnitude representation is more common.
1027    
1028     In two's complement representation of multiple-precision integers,
1029     the representation is the same as suggested by
1030     (\ref{eq:ccil0:sroi0:sros0:00}), except
1031     more bits are involved. For a two's complement representation
1032     of a number consisting of $n$ machine integers with $W$ bits per
1033     machine integer,
1034    
1035     \begin{equation}
1036     \label{eq:ccil0:sroi0:sros0:02}
1037     u = - u_{B(Wn-1)} 2^{Wn-1} + \sum_{i=0}^{Wn-2} u_{B(i)} 2^i .
1038     \end{equation}
1039    
1040     Because we would like to know how to compare signed multiple-precision
1041     integers in two's complement representation, we can gain some
1042     insight into the representation by rewriting
1043     (\ref{eq:ccil0:sroi0:sros0:02}) in terms of machine integers:
1044    
1045     \begin{equation}
1046     \label{eq:ccil0:sroi0:sros0:03}
1047     u = - u_{B(Wn-1)} 2^{Wn-1}
1048     +
1049     \sum_{i=W(m-1)}^{Wn-2} u_{B(i)} 2^i
1050     +
1051     \sum_{i=0}^{m-2} u_{i} 2^{Wi} .
1052     \end{equation}
1053    
1054     (\ref{eq:ccil0:sroi0:sros0:03}) gives some insight into the
1055     relative values of multiple-precision signed two's complement
1056     integers with respect to the values of the machine integers
1057     that comprise them. We discuss this further in
1058     Section \ref{ccil0:scsi0}.
1059    
1060     In sign-magnitude representation of multiple-precision signed two's
1061     complement integers, an integer $u$ is represented as a sign
1062     bit (usually a value of one indicates negativity), and a magnitude,
1063     which is $|u|$. Unlike two's complement representation,
1064     sign-magnitude representation, has two representations of zero---a positive
1065     one and a negative one. Either a canonical form for zero should be
1066     adopted, or both values should be treated identically.
1067    
1068     Assuming that the sign bit is stored in the most significant bit position,
1069     it is easy to deduce that the value of a multiple-precision
1070     signed two's complement integer in sign-magnitude representation is
1071    
1072     \begin{equation}
1073     \label{eq:ccil0:sros0:srou0:04}
1074     u = (-1)^{u_{B(m-1)}} \sum_{i=0}^{m-2} u_{B(i)} 2^i .
1075     \end{equation}
1076    
1077     Sign-magnitude representation is especially convenient because
1078     it allows machine instructions which accept unsigned operands to be used
1079     to make calculations involving signed integers.
1080    
1081    
1082    
1083     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1084     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1085     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1086     \section{Characteristics Of Practical Processors}
1087     %Section tag: CPP
1088     \label{ccil0:scpp0}
1089    
1090     Before discussing specific algorithms, it is necessary to
1091     discuss the construction of practical processors---how such a processor
1092     manipulates machine integers. We accept as a typical processor the
1093     TMS-370C8, an 8-bit microcontroller manufactured by
1094     Texas Instruments.
1095    
1096     \begin{figure}
1097     \centering
1098     \includegraphics[width=4.6in]{c_cil0/t370flag.eps}
1099     \caption{Texas Instruments TMS-370C8 Flags}
1100     \label{fig:ccil0:scpp0:00}
1101     \end{figure}
1102    
1103     \begin{figure}
1104     \centering
1105     \includegraphics[width=4.6in]{c_cil0/t370cjmp.eps}
1106     \caption{Texas Instruments TMS-370C8 Conditional Jump Instructions}
1107     \label{fig:ccil0:scpp0:01}
1108     \end{figure}
1109    
1110     A typical microcontroller allows operations on machine integers
1111     in the following steps:
1112    
1113     \begin{itemize}
1114     \item A machine instruction is performed on one or two machine
1115     integer operands (for example: addition, subtraction,
1116     multiplication, division, increment, decrement, complement,
1117     negation, or comparison). This machine instruction may
1118     produce a result, and usually sets a number of condition flags that
1119     reflect the nature and validity of the result (Is it zero?
1120     Is it negative? Did the result overflow?). As an
1121     example, the condition
1122     flags of the TMS-370C8 are shown in Figure \ref{fig:ccil0:scpp0:00}.
1123     .
1124     \item A conditional branch instruction is used to branch conditionally
1125     based on the state of the condition flags. The definition of
1126     the condition flags and the way in which the conditional
1127     branch instruction utilizes them is designed to provide a
1128     way to treat both unsigned and signed machine integers.
1129     As an example, the way in which the conditional
1130     jump instructions of the TMS-370C8 use the flags
1131     is shown in Figure \ref{fig:ccil0:scpp0:01}.
1132     \end{itemize}
1133    
1134     It is not too often necessary to understand in detail
1135     the Boolean relationships that govern how machine integers are
1136     added, subtracted, and compared; and how signed comparisons differ
1137     from unsigned comparisons. In most cases, it is adequate to
1138     rely on the design of the microcontroller. However, we do present
1139     rudimentary observations in this section.
1140    
1141    
1142    
1143     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1144     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1145     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1146     \section{Comparison Of Integers}
1147    
1148    
1149     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1150     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1151     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1152     \subsection{Comparison Of Unsigned Integers}
1153    
1154    
1155     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1156     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1157     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1158     \subsection{Comparison Of Signed Integers}
1159     %Section Tag: CSI0
1160     \label{ccil0:scsi0}
1161    
1162    
1163     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1164     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1165     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1166     \section{Integer Addition}
1167     %Section tag: IAD0
1168     \label{ccil0:siad0}
1169    
1170     Addition of two $m$-bit integers is a combinational function---that is,
1171     the inputs uniquely determine the output. Addition of binary
1172     numbers is performed
1173    
1174    
1175     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1176     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1177     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1178     \subsection{Hardware Implementation Of Addition}
1179    
1180    
1181     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1182     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1183     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1184     \subsection{Addition Of Unsigned Operands}
1185    
1186    
1187     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1188     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1189     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1190     \subsection{Addition Of Signed Operands}
1191    
1192    
1193     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1194     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1195     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1196     \section {Integer Subtraction}
1197    
1198    
1199     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1200     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1201     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1202     \subsection{Hardware Implementation Of Subtraction}
1203    
1204    
1205     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1206     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1207     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1208     \subsection{Subtraction Of Unsigned Operands}
1209    
1210    
1211     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1212     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1213     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1214     \subsection{Subtraction Of Signed Operands}
1215    
1216    
1217    
1218     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1219     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1220     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1221     \section{Integer Multiplication}
1222    
1223    
1224     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1225     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1226     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1227     \subsection{Hardware Implementation Of Multiplication}
1228    
1229    
1230     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1231     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1232     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1233     \subsection{Multiplication Of Unsigned Operands}
1234    
1235    
1236     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1237     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1238     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1239     \subsection{Multiplication Of Signed Operands}
1240    
1241    
1242    
1243     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1244     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1245     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1246     \section{Integer Division}
1247     \label{ccil0:sidv0}
1248    
1249     \index{division}\index{integer division}In this section,
1250     we discuss the best known methods of dividing integers using
1251     typical microcontroller instruction sets. In general, given
1252     two arbitrary integers $p$ and $q$, we are interested in determining
1253     their quotient $q=\lfloor{}p/q\rfloor$ and remainder
1254     $r=p\bmod{}q$ as economically as possible.
1255    
1256    
1257     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1258     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1259     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1260     \subsection{Hardware Implementation Of Division}
1261    
1262    
1263     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1264     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1265     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1266     \subsection{General Unsigned Division Without A Machine Division Instruction}
1267     \label{ccil0:sidv0:sgdn0}
1268    
1269    
1270     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1271     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1272     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1273     \subsection{General Unsigned Division With A Machine Division Instruction}
1274     \label{ccil0:sidv0:sgdu0}
1275    
1276     As mentioned many places in this work, efficiency in microcontroller software
1277     involves phrasing computational problems in a way which makes good use of
1278     the machine instruction set. In Section \ref{ccil0:sidv0:sgdn0} we discussed
1279     the classic shift-compare-subtract algorithm for division. This algorithm
1280     is far from efficient. A reasonable question to ask is whether we can
1281     leverage ``small'' division capability (provided by the machine instruction set)
1282     to accomplish ``large'' divisions (those which we require in practice).
1283     It ends up that this is possible: the technique involved is effectively
1284     to use machine division instructions to estimate the highest-order bits of
1285     the quotient based on the highest-order bits of the dividend and divisor.
1286    
1287     Knuth's discussion of division
1288     algorithms \cite[pp. 270-275]{bibref:b:knuthclassic2ndedvol2} is the
1289     basis for most of the material in this subsection. However, Knuth has
1290     a gift for terseness that is sometimes a curse for the reader, and so
1291     we take more time than Knuth to explain certain results.
1292    
1293     First, as a starting point, we present \emph{Algorithm D} from
1294     Knuth \cite[pp. 272-273]{bibref:b:knuthclassic2ndedvol2}. Then,
1295     we justify the algorithm and explain why it is valid. Finally,
1296     we supply implementation advice for microcontroller instruction sets.
1297    
1298     \begin{vworkalgorithmstatementpar}{Arbitrary Unsigned Division Using
1299     Machine Unsigned Division Instructions}
1300     \label{alg:ccil0:sidv0:sgdu0:01}
1301     (From Knuth \cite[pp. 272-273]{bibref:b:knuthclassic2ndedvol2})
1302     Given nonnegative integers $u=(u_{m+n-1} \ldots{} u_1 u_0)_b$
1303     and $v=(v_{n-1} \ldots{} v_1 v_0)_b$, where
1304     $v_{n-1} \neq 0$ and $n > 1$, we form the radix-$b$ quotient
1305     $\lfloor{}u/v\rfloor{} = (q_m q_{m-1} \ldots{} q_0)_b$ and
1306     the remainder $u \bmod v = (r_{n-1} \ldots{} r_1 r_0)_b$. When
1307     $n=1$, the simpler algorithm of
1308     Subsection \ref{ccil0:sidv0:sldm0}
1309     should be used.
1310    
1311     \begin{algblvl0}
1312     \item \label{enumstep:alg:ccil0:sidv0:sgdu0:01:01}
1313     [Normalize.] Set $d \gets \lfloor{}b/(v_{n-1} + 1)\rfloor$.
1314     Then set $(u_{m+n} u_{m+n-1} \ldots{} u_1 u_0)_b$ equal to
1315     $(u_{m+n-1} \ldots{} u_1 u_0)_b$ times $d$; similarly,
1316     set $(v_{n-1} \ldots{} v_1 v_0)_b$ equal to
1317     $(v_{n-1} \ldots{} v_1 v_0)_b$ times $d$. (Notice the introduction
1318     of a new digit position $u_{m+n}$ at the left of
1319     $u_{m+n-1}$; if $d=1$, all we need to do in this step is set
1320     $u_{m+n} \gets 0$. On a binary computer it may be preferable
1321     to choose $d$ to be a power of 2 instead of using the value
1322     suggested here; any value of $d$ that results in
1323     $v_{n-1} \geq \lfloor{}b/2\rfloor$ will suffice. See also
1324     exercise 37.)
1325     \item \label{enumstep:alg:ccil0:sidv0:sgdu0:01:02}
1326     [Initialize $j$.] Set $j \gets m$. (The loop on $j$,
1327     steps
1328     \ref{enumstep:alg:ccil0:sidv0:sgdu0:01:03}
1329     through
1330     \ref{enumstep:alg:ccil0:sidv0:sgdu0:01:07},
1331     will be essentially a division of
1332     $(u_{j+n} \ldots{} u_{j+1} u_j)_b$ by $(v_{n-1} \ldots{} v_1 v_0)_b$ to
1333     get a single quotient digit $q_j$; see Figure \ref{fig:alg:ccil0:sidv0:sgdu0:01:01}.)
1334    
1335     \begin{figure}
1336     \centering
1337     \includegraphics[width=4.6in]{c_cil0/kdfc01.eps}
1338     \caption{Flowchart For Algorithm \ref{alg:ccil0:sidv0:sgdu0:01} (From \cite[p. 273]{bibref:b:knuthclassic2ndedvol2})}
1339     \label{fig:alg:ccil0:sidv0:sgdu0:01:01}
1340     \end{figure}
1341    
1342     \item \label{enumstep:alg:ccil0:sidv0:sgdu0:01:03}
1343     [Calculate $\hat{q}$.] Set
1344     $\hat{q} \gets \lfloor{}u_{j+n}b + u_{j+n-1})/v_{n-1}\rfloor$ and
1345     let $\hat{r}$ be the remainder, $(u_{j+n}b + u_{j+n-1}) \bmod v_{n-1}$.
1346     Now test if $\hat{q} = b$ or $\hat{q} v_{n-2} > b\hat{r} + u_{j+n-2}$;
1347     if so, decrease $\hat{q}$ by 1, increase $\hat{r}$ by $v_{n-1}$, and repeat
1348     this test if $\hat{r} < b$. (The test of $v_{n-2}$ determines at high
1349     speed most of the cases in which the trial value $\hat{q}$ is one too large,
1350     and it eliminates \emph{all} cases where $\hat{q}$ is two too large;
1351     see exercises 19, 20, 21.)
1352     \item \label{enumstep:alg:ccil0:sidv0:sgdu0:01:04}
1353     [Multiply and subtract.] Replace $(u_{j+n} u_{j+n-1} \ldots{} u_j)_b$ by
1354    
1355     \begin{equation}
1356     \nonumber
1357     (u_{j+n} u_{j+n-1} \ldots{} u_j)_b - \hat{q} (0 v_{n-1} \ldots{} v_1 v_0)_b.
1358     \end{equation}
1359    
1360     This computation consists of a simple multiplication by a one-place number,
1361     combined with a subtraction. The digits $(u_{j+n}, u_{j+n-1}, \ldots{}, u_j)$
1362     should be kept positive; if the result of this step is actually negative,
1363     $(u_{j+n} u_{j+n-1} \ldots{} u_j)_b$ should be left as the true
1364     value plus $b^{n+1}$, namely as the $b$'s complement of the true value, and
1365     a ``borrow'' to the left should be remembered.
1366     \item \label{enumstep:alg:ccil0:sidv0:sgdu0:01:05}
1367     [Test remainder.] Set $q_j \gets \hat{q}$. If the result of step
1368     \ref{enumstep:alg:ccil0:sidv0:sgdu0:01:04} was negative, go to
1369     step \ref{enumstep:alg:ccil0:sidv0:sgdu0:01:06}; otherwise go on to
1370     step \ref{enumstep:alg:ccil0:sidv0:sgdu0:01:07}.
1371     \item \label{enumstep:alg:ccil0:sidv0:sgdu0:01:06}
1372     [Add back.] (The probability that this step is necessary is very small, on the
1373     order of only $2/b$, as shown in exercise 21; test data to activate this step
1374     should therefore be specifically contrived when debugging.) Decrease
1375     $q_j$ by 1, and add $(0 v_{n-1} \ldots v_1 v_0)_b$ to
1376     $(u_{j+n} u_{j+n-1} \ldots{} u_{j+1} u_j)_b$. (A carry will occur to the left of
1377     $u_{j+n}$, and it should be ignored since it cancels with the borrow that
1378     occured in step \ref{enumstep:alg:ccil0:sidv0:sgdu0:01:04}.)
1379     \item \label{enumstep:alg:ccil0:sidv0:sgdu0:01:07}
1380     [Loop on $j$.] Decrease $j$ by one. Now if $j \geq 0$, go back to step
1381     \ref{enumstep:alg:ccil0:sidv0:sgdu0:01:03}.
1382     \item \label{enumstep:alg:ccil0:sidv0:sgdu0:01:08}
1383     [Unnormalize.] Now $(q_m \ldots{} q_1 q_0)_b$ is the desired quotient, and
1384     the desired remainder may be obtained by dividing
1385     $(u_{n-1} \ldots{} u_1 u_0)_b$ by $d$.
1386     \end{algblvl0}
1387     \end{vworkalgorithmstatementpar}
1388     \vworkalgorithmfooter{}
1389    
1390     The general idea of Algorithm \ref{alg:ccil0:sidv0:sgdu0:01} is that
1391     digits (machine words) of the quotient $q$ can be successively estimated
1392     based on the first digits of the dividend and divisor. Knuth
1393     \cite[p. 271]{bibref:b:knuthclassic2ndedvol2} explores the properties of
1394     the digit estimate
1395    
1396     \begin{equation}
1397     \label{eq:ccil0:sidv0:sgdu0:01}
1398     \hat{q} = \min \left( {\left\lfloor{\frac{u_n b + u_{n-1}}{v_{n-1}}}\right\rfloor, b-1} \right).
1399     \end{equation}
1400    
1401     The first point to make about an estimate in the form of
1402     (\ref{eq:ccil0:sidv0:sgdu0:01}) is that it can only be accomplished
1403     efficiently if the machine-native division instruction supports
1404     overflow detection, since it is possible that
1405     $(u_n b + u_{n-1})/v_{n-1} \geq b$, even if
1406     $u/v < b$, as is shown by the following example.
1407    
1408     \begin{vworkexamplestatement}
1409     \label{ex:ccil0:sidv0:sgdu0:01:01}
1410     Assume that we wish to apply the estimate of $\hat{q}$ provided by
1411     (\ref{eq:ccil0:sidv0:sgdu0:01})
1412     to $u=16,776,704$ and $v=65,535$. Demonstrate that a machine division
1413     overflow will occur when estimating the first digit, assuming a processor
1414     that can divide a 16-bit dividend by an 8-bit divisor to produce an 8-bit
1415     quotient.
1416     \end{vworkexamplestatement}
1417     \begin{vworkexampleparsection}{Solution}
1418     Note that according to Knuth's intention, the word size on such a machine
1419     is 8 bits. Thus, $b=256$. Note that $u/v = 255 + 255/256 < b = 256$, as
1420     required by Knuth's precondition. However, although $u/v < b$,
1421     $u = [255 \; 254 \; 0] [256^2 \; 256 \; 1]^T = [u_2 u_1 u_0] [b^2 b^1 b^0]^T$ and
1422     $v = [255 \; 255] [256 \; 1]^T = [v_1 v_0] [b^1 b^0]^T$, so that calculating
1423     an estimate $\hat{q}$ as required by (\ref{eq:ccil0:sidv0:sgdu0:01}),
1424     $(u_n b + u_{n-1})/v_{n-1} = 65,534/255 = 256 + 254/255 \geq b$, is a division
1425     overflow for a single machine division instruction. Thus, it follows that
1426     a machine with division overflow detection can quickly determine that $b-1$ from
1427     (\ref{eq:ccil0:sidv0:sgdu0:01}) is the minimum, whereas a machine without
1428     division overflow
1429     detection would have to use several additional machine instructions to make
1430     this determination.
1431     \end{vworkexampleparsection}
1432     \vworkexamplefooter{}
1433    
1434     The second thing to establish about $\hat{q}$ as defined by
1435     (\ref{eq:ccil0:sidv0:sgdu0:01}) is how ``good'' of an estimate
1436     $\hat{q}$ is---how much information, exactly, about $q$ can we
1437     obtain by examining the first two words of $u$ and the first
1438     word of $v$?
1439    
1440     We first establish in the following lemma that our estimate of
1441     $q$, $\hat{q}$, can be no less than $q$.
1442    
1443     \begin{vworklemmastatementpar}{\mbox{\boldmath$\hat{q} \geq q$}}
1444     \label{lem:ccil0:sidv0:sgdu0:01}
1445     The estimate of $q$ provided by (\ref{eq:ccil0:sidv0:sgdu0:01}),
1446     $\hat{q}$ is always at least as great as the actual value of
1447     $q$, i.e. $\hat{q} \geq q$.
1448     \end{vworklemmastatementpar}
1449     \begin{vworklemmaproof}
1450     Knowledge of $u_{n}$, $u_{n-1}$, and $v_{n-1}$ necessarily confine
1451     the intervals in which the actual values of $u$ and $v$ may be;
1452     specifically:\footnote{In
1453     (\ref{eq:lem:ccil0:sidv0:sgdu0:01:04})
1454     and
1455     (\ref{eq:lem:ccil0:sidv0:sgdu0:01:07}),
1456     we use statements of the form ``$x = x$'' as an idiom for
1457     ``$x$ is known''.}
1458    
1459     \begin{eqnarray}
1460     \label{eq:lem:ccil0:sidv0:sgdu0:01:01}
1461     u & = & \sum_{i=0}^{n} u_i b^i \\
1462     \label{eq:lem:ccil0:sidv0:sgdu0:01:02}
1463     & = & u_n b^n + u_{n-1} b^{n-1} + \ldots{} + u_2 b^2 + u_1 b + u_0 \\
1464     \label{eq:lem:ccil0:sidv0:sgdu0:01:03}
1465     & = & (u_n b + u_{n-1}) b^{n-1} + \ldots{} + u_2 b^2 + u_1 b + u_0
1466     \end{eqnarray}
1467    
1468     \begin{eqnarray}
1469     \nonumber & (u_n = u_n \wedge u_{n-1} = u_{n-1}) & \\
1470     \label{eq:lem:ccil0:sidv0:sgdu0:01:04}
1471     & \vworkvimp & \\
1472     \nonumber & (u_n b + u_{n-1}) b^{n-1} \leq u \leq (u_n b + u_{n-1}) b^{n-1} + b^{n-1} - 1 &
1473     \end{eqnarray}
1474    
1475     \begin{eqnarray}
1476     \label{eq:lem:ccil0:sidv0:sgdu0:01:05}
1477     v & = & \sum_{i=0}^{n-1} v_i b^i \\
1478     \label{eq:lem:ccil0:sidv0:sgdu0:01:06}
1479     & = & v_{n-1} b^{n-1} + v_{n-2} b^{n-2} + \ldots{} + v_2 b^2 + v_1 b + v_0
1480     \end{eqnarray}
1481    
1482     \begin{equation}
1483     \label{eq:lem:ccil0:sidv0:sgdu0:01:07}
1484     (v_{n-1} = v_{n-1})
1485     \vworkhimp
1486     v_{n-1} b^{n-1} \leq v \leq v_{n-1} b^{n-1} + b^{n-1} - 1
1487     \end{equation}
1488    
1489     (\ref{eq:lem:ccil0:sidv0:sgdu0:01:04}) and
1490     (\ref{eq:lem:ccil0:sidv0:sgdu0:01:07}) reflect the uncertainties in the
1491     values of $u$ and $v$ respectively because only the first digit(s) of
1492     $u$ and $v$ are being considered in forming the estimate $\hat{q}$.
1493    
1494     By definition, the actual value of $q$ is $\lfloor{}u/v\rfloor$. For a
1495     rational function $f(u,v) = u/v$ where $u \in [u_{min}, u_{max}]$ and
1496     $v \in [v_{min}, v_{max}]$, the minimum value of $u/v$ occurs at
1497     $u_{min}/v_{max}$, and the maximum value of $u/v$ occurs at
1498     $u_{max}/v_{min}$. We can therefore write that
1499    
1500     \begin{equation}
1501     \label{eq:lem:ccil0:sidv0:sgdu0:01:08}
1502     \left\lfloor{\frac{(u_n b + u_{n-1}) b^{n-1}}{v_{n-1} b^{n-1} + b^{n-1} - 1}}\right\rfloor
1503     \leq
1504     q
1505     \leq
1506     \left\lfloor{\frac{(u_n b + u_{n-1}) b^{n-1} + b^{n-1} - 1}{v_{n-1} b^{n-1}}}\right\rfloor .
1507     \end{equation}
1508    
1509     In other words, knowledge of $u_{n}$, $u_{n-1}$, and $v_{n-1}$ confines $q$ to the
1510     interval indicated in (\ref{eq:lem:ccil0:sidv0:sgdu0:01:08}). We must prove that,
1511     given a specific $u_{n}$, $u_{n-1}$, and $v_{n-1}$, $\hat{q}$ is at least as large as
1512     the upper bound in (\ref{eq:lem:ccil0:sidv0:sgdu0:01:08}); otherwise we could find a
1513     $q$ such that $q > \hat{q}$. We can algebraically manipulate the upper bound in
1514     in (\ref{eq:lem:ccil0:sidv0:sgdu0:01:08}) to yield
1515    
1516     \begin{equation}
1517     \label{eq:lem:ccil0:sidv0:sgdu0:01:09}
1518     \left\lfloor{\frac{(u_n b + u_{n-1}) b^{n-1}}{v_{n-1} b^{n-1} + b^{n-1} - 1}}\right\rfloor
1519     \leq
1520     q
1521     \leq
1522     \left\lfloor{\frac{u_n b + u_{n-1} + \frac{b^{n-1}-1}{b^{n-1}}}{v_{n-1}}}\right\rfloor .
1523     \end{equation}
1524    
1525     In (\ref{eq:lem:ccil0:sidv0:sgdu0:01:09}), since $(b^{n-1}-1)/b^{n-1} < 1$ and since
1526     $u_n b + u_{n-1}$ is an integer, we can conclude that
1527     $\lfloor u_n b + u_{n-1} + (b^{n-1}-1)/b^{n-1} \rfloor = \lfloor u_n b + u_{n-1} \rfloor$
1528     and hence that
1529    
1530     \begin{equation}
1531     \label{eq:lem:ccil0:sidv0:sgdu0:01:10}
1532     q
1533     \leq
1534     \left\lfloor{\frac{u_n b + u_{n-1} + \frac{b^{n-1}-1}{b^{n-1}}}{v_{n-1}}}\right\rfloor
1535     =
1536     \left\lfloor{\frac{u_n b + u_{n-1}}{v_{n-1}}}\right\rfloor
1537     =
1538     \hat{q} .
1539     \end{equation}
1540    
1541     Therefore, $\hat{q} \geq q$.
1542     \end{vworklemmaproof}
1543     \vworklemmafooter{}
1544    
1545     Lemma \ref{lem:ccil0:sidv0:sgdu0:01} establishes that
1546     a digit estimate $\hat{q}$ based on the first digit of the
1547     divisor $v$ can be no less than the actual digit $q$, i.e.
1548     $\hat{q}-q \geq 0$. However, we must also establish an upper bound
1549     on $\hat{q}-q$.
1550    
1551     Intuitively, based on
1552     (\ref{eq:lem:ccil0:sidv0:sgdu0:01:06}), we might guess that
1553     if $v_{n-1}$ is small, the estimate $\hat{q}$ may be quite
1554     poor, as the interval to which the actual value of $v$ is confined
1555     may be quite large. This fact is the basis for the normalization
1556     step [\ref{enumstep:alg:ccil0:sidv0:sgdu0:01:01}] in Algorithm
1557     \ref{alg:ccil0:sidv0:sgdu0:01}. We now prove a useful result
1558     for how much $u, v$ must be normalized so that $\hat{q}-q \leq 2$.
1559    
1560     \begin{vworklemmastatementpar}{Normalization Requirement So That
1561     \mbox{\boldmath$\hat{q} - q \leq 2$}}
1562     \label{lem:ccil0:sidv0:sgdu0:02}
1563     If $v_{n-1} \geq \lfloor b/2 \rfloor$ and $\hat{q}$ is chosen as
1564     indicated in (\ref{eq:ccil0:sidv0:sgdu0:01}), then
1565     $0 \leq \hat{q} - q \leq 2$.
1566     \end{vworklemmastatementpar}
1567     \begin{vworklemmaproof}
1568     The lower limit on $\hat{q} - q$ is proved in Lemma \ref{lem:ccil0:sidv0:sgdu0:01}.
1569     We now seek only to prove that $\hat{q} - q \leq 2$.
1570     By definition of $\hat{q}$ and $q$,
1571    
1572     \begin{equation}
1573     \label{eq:lem:ccil0:sidv0:sgdu0:02:01}
1574     \hat{q} - q = \left\lfloor {\frac{u_n b + u_{n-1}}{v_{n-1}}} \right\rfloor
1575     - \left\lfloor {\frac{u}{v}} \right\rfloor
1576     \end{equation}
1577    
1578     When only nonnegative integers are involved,
1579     (\cmtnzeroxrefhyphen\ref{eq:cmtn0:sfcf0:02})
1580     supplies an exact expression for the floor of a
1581     ratio of integers. Using (\cmtnzeroxrefhyphen\ref{eq:cmtn0:sfcf0:02}),
1582     (\ref{eq:lem:ccil0:sidv0:sgdu0:02:01}) can be decomposed into
1583    
1584     \begin{equation}
1585     \label{eq:lem:ccil0:sidv0:sgdu0:02:02}
1586     \hat{q} - q = \frac{u_n b + u_{n-1}}{v_{n-1}}
1587     - \frac{(u_n b + u_{n-1}) \bmod v_{n-1}}{v_{n-1}}
1588     - \frac{u}{v}
1589     + \frac{u \bmod v}{v} .
1590     \end{equation}
1591    
1592     \noindent{}Note that (\ref{eq:lem:ccil0:sidv0:sgdu0:02:02}) is an exact
1593     expression (rather than an
1594     inequality).
1595    
1596     Note in (\ref{eq:lem:ccil0:sidv0:sgdu0:02:02}) that
1597     $(u_n b + u_{n-1}) \bmod v_{n-1} \in [0, v_{n-1}-1]$, and that in general
1598     there is no reason to expect it cannot be zero. Thus, we can assume that
1599     it \emph{is} zero, which will maximize $\hat{q}-q$. We can thus convert
1600     (\ref{eq:lem:ccil0:sidv0:sgdu0:02:02}) into the inequality
1601    
1602     \begin{equation}
1603     \label{eq:lem:ccil0:sidv0:sgdu0:02:03}
1604     \hat{q} - q \leq \frac{u_n b + u_{n-1}}{v_{n-1}}
1605     - \frac{u}{v}
1606     + \frac{u \bmod v}{v} .
1607     \end{equation}
1608    
1609     In (\ref{eq:lem:ccil0:sidv0:sgdu0:02:03}) we can also observe that
1610     $(u \bmod v)/v \in [0, (v-1)/v]$. If we replace this expression with
1611     ``1'' (which is unattainable, but barely), this will change the relational
1612     operator from ``$\leq$'' to ``$<$'':
1613    
1614     \begin{equation}
1615     \label{eq:lem:ccil0:sidv0:sgdu0:02:04}
1616     \hat{q} - q < \frac{u_n b + u_{n-1}}{v_{n-1}}
1617     - \frac{u}{v}
1618     + 1 .
1619     \end{equation}
1620    
1621     The result we wish to show is that with $v_{n-1} \geq \lfloor b/2 \rfloor$,
1622     $\hat{q}-q \leq 2$. To simplify the subsequent algebraic manipulations, note in
1623     (\ref{eq:lem:ccil0:sidv0:sgdu0:02:04}) that
1624    
1625     \begin{eqnarray}
1626     \label{eq:lem:ccil0:sidv0:sgdu0:02:05}
1627     & \hat{q} - q \leq 2 & \\
1628     \nonumber & \vworkvertequiv & \\
1629     \label{eq:lem:ccil0:sidv0:sgdu0:02:06}
1630     & \displaystyle \frac{u_n b + u_{n-1}}{v_{n-1}}
1631     - \frac{u}{v}
1632     + 1 \leq 3 & \\
1633     \nonumber & \vworkvertequiv & \\
1634     \label{eq:lem:ccil0:sidv0:sgdu0:02:07}
1635     & \displaystyle \frac{u_n b + u_{n-1}}{v_{n-1}}
1636     - \frac{u}{v} \leq 2 &
1637     \end{eqnarray}
1638    
1639     (\ref{eq:lem:ccil0:sidv0:sgdu0:02:06}) may be counterintuitive, so
1640     further explanation is offered here. Since $\hat{q} \in \vworkintset$ and $q \in \vworkintset$,
1641     $\hat{q}-q \in \vworkintset$. Thus, proving
1642     (\ref{eq:lem:ccil0:sidv0:sgdu0:02:06}) or
1643     (\ref{eq:lem:ccil0:sidv0:sgdu0:02:07}) proves that
1644     $\hat{q}-q \in \{ \ldots, -1, 0, 1, 2 \}$ (however, by
1645     Lemma \ref{lem:ccil0:sidv0:sgdu0:01}, $\hat{q}-q \geq 0$, so in fact
1646     what would be proved is that $\hat{q}-q \in \{ 0, 1, 2 \}$). For
1647     algebraic simplicity,
1648     we choose to prove (\ref{eq:lem:ccil0:sidv0:sgdu0:02:07}).
1649    
1650     First, adjust numerator and denominator of the first term in
1651     (\ref{eq:lem:ccil0:sidv0:sgdu0:02:07}) by $b^{n-1}$ so that the terms more closely
1652     resemble $u$ and $v$ in
1653     (\ref{eq:lem:ccil0:sidv0:sgdu0:01:02})
1654     and
1655     (\ref{eq:lem:ccil0:sidv0:sgdu0:01:06}):
1656    
1657     \begin{equation}
1658     \label{eq:lem:ccil0:sidv0:sgdu0:02:08}
1659     \frac{u_n b^n + u_{n-1} b^{n-1}}{v_{n-1} b^{n-1}}
1660     - \frac{u}{v} \leq 2 .
1661     \end{equation}
1662    
1663     For logical implication to be maintained,
1664     we must make the most pessimistic choices and assumptions possible in
1665     (\ref{eq:lem:ccil0:sidv0:sgdu0:02:08}) in order to maximize the value
1666     of the left side of the inequality.
1667     The first assumption to be made is the error in estimating
1668     $u$ and $v$ based on their most significant digits. It can be
1669     seen that (\ref{eq:lem:ccil0:sidv0:sgdu0:02:08}) will be maximized if:
1670    
1671     \begin{itemize}
1672     \item We assume that $u = u_{n} b^n + u_{n-1} b^{n-1}$ (i.e. that we estimate
1673     $u$ precisely).
1674     \item We assume that $v = v_{n-1} b^{n-1} + b^{n-1} - 1$ (i.e. that
1675     we underestimate $v$ by the maximum amount possible).
1676     \item We minimize the value of $v_{n-1} b^{n-1}$.
1677     \end{itemize}
1678    
1679     Assuming that $u$ is estimated precisely yields
1680    
1681     \begin{equation}
1682     \label{eq:lem:ccil0:sidv0:sgdu0:02:09}
1683     \frac{u}{v_{n-1} b^{n-1}}
1684     - \frac{u}{v} \leq 2 .
1685     \end{equation}
1686    
1687     Assuming that $v$ is underestimated by the maximum amount possible
1688     yields
1689    
1690     \begin{equation}
1691     \label{eq:lem:ccil0:sidv0:sgdu0:02:10}
1692     \frac{u}{v - b^{n-1} + 1}
1693     - \frac{u}{v} \leq 2 .
1694     \end{equation}
1695    
1696     Finally, with $b$ and $v$ fixed, $u$ can be maximized by noting that
1697     $u \leq bv - 1$ (by the problem assumption that the quotient is a single digit).
1698     However, for algebraic simplicity, we make the substitution $u=bv$ (rather than
1699     $u=bv-1$), since the weaker upper bound is strong enough to prove the
1700     first result we seek.
1701    
1702     \begin{equation}
1703     \label{eq:lem:ccil0:sidv0:sgdu0:02:11}
1704     \frac{bv}{v - b^{n-1} + 1}
1705     - \frac{bv}{v} \leq 2
1706     \end{equation}
1707    
1708     \begin{equation}
1709     \label{eq:lem:ccil0:sidv0:sgdu0:02:12}
1710     \frac{bv}{v - b^{n-1} + 1}
1711     - b \leq 2
1712     \end{equation}
1713    
1714     Solving (\ref{eq:lem:ccil0:sidv0:sgdu0:02:12})
1715     for $v$ yields
1716    
1717     \begin{equation}
1718     \label{eq:lem:ccil0:sidv0:sgdu0:02:13}
1719     v \geq \frac{b^n}{2} + b^{n-1} - \frac{1}{b} - 1
1720     \end{equation}
1721    
1722     Again using the assumption that $v$ is underestimated by the maximum amount
1723     possible, we may make the substitution that $v = v_{n-1} b^{n-1} + b^{n-1} -1$,
1724     leading to
1725    
1726     \begin{equation}
1727     \label{eq:lem:ccil0:sidv0:sgdu0:02:13b}
1728     v_{n-1} \geq \frac{b}{2} - \frac{1}{2 b^{n-2}} .
1729     \end{equation}
1730    
1731     There are two cases to consider: $b$ even and $b$ odd. If $b$ is even, the
1732     proof is complete, as $\lfloor b/2 \rfloor = b/2$ and the choice of
1733     $v_{n-1} = \lfloor b/2 \rfloor$ will automatically satisfy
1734     (\ref{eq:lem:ccil0:sidv0:sgdu0:02:13b}). However, if $b$ is odd,
1735     $\lfloor b/2 \rfloor = b/2 - 1/2 < b/2 - 1/2b^{n-2}$, violating
1736     (\ref{eq:lem:ccil0:sidv0:sgdu0:02:13b}),
1737     and so we need to
1738     further examine this case.
1739    
1740     If $b$ is odd and $v_{n-1} = \lfloor b/2 \rfloor$, then
1741     $v_{n-1} = b/2 - 1/2$, violating (\ref{eq:lem:ccil0:sidv0:sgdu0:02:13b}).
1742     However, any larger choice of $v_{n-1}$ (such as
1743     $\lfloor b/2 \rfloor + 1$, $\lfloor b/2 \rfloor + 2$, etc.) satisfies
1744     (\ref{eq:lem:ccil0:sidv0:sgdu0:02:13b}); so that it remains only to prove
1745     the $v_{n-1} = \lfloor b/2 \rfloor = b/2 - 1/2$
1746     case.
1747    
1748     If $v_{n-1} = \lfloor b/2 \rfloor = b/2 - 1/2$, then
1749    
1750     \begin{eqnarray}
1751     \label{eq:lem:ccil0:sidv0:sgdu0:02:14}
1752     v & \in & \left[
1753     \left( \frac{b}{2} - \frac{1}{2}\right) b^{n-1},
1754     \left( \frac{b}{2} - \frac{1}{2}\right) b^{n-1} + b^{n-1} - 1
1755     \right] \\
1756     \nonumber & = &
1757     \left[
1758     \frac{b^n}{2} - \frac{b^{n-1}}{2},
1759     \frac{b^n}{2} + \frac{b^{n-1}}{2} -1
1760     \right] .
1761     \end{eqnarray}
1762    
1763     Note in this case that the estimation error ($v - v_{n-1}b^{n-1}$) and the
1764     value of $v$ are not independent; and in fact it is this aspect
1765     of the problem that has led to the violation of
1766     (\ref{eq:lem:ccil0:sidv0:sgdu0:02:13b}) with $b$ odd and
1767     $v_{n-1} = \lfloor b/2 \rfloor$.
1768    
1769     In order to prove the case of $b$ odd and $v = \lfloor b/2 \rfloor = b/2 - 1/2$,
1770     we must reexamine some simplifying assumptions made earlier in order to obtain
1771     tighter inequalities. In (\ref{eq:lem:ccil0:sidv0:sgdu0:02:02}), we can no
1772     longer accept the maximum of $(u \bmod v)/v$ as one; instead we construct the
1773     tighter inequality
1774    
1775     \begin{eqnarray}
1776     \label{eq:lem:ccil0:sidv0:sgdu0:02:15}
1777     & \displaystyle \hat{q} - q \leq \frac{u_n b + u_{n-1}}{v_{n-1}}
1778     - \frac{u}{v}
1779     + \frac{u \bmod v}{v} & \\
1780     \nonumber & \vworkvimp & \\
1781     \label{eq:lem:ccil0:sidv0:sgdu0:02:16}
1782     & \displaystyle \hat{q} - q \leq \frac{u_n b + u_{n-1}}{v_{n-1}}
1783     - \frac{u}{v}
1784     + \frac{v-1}{v} , &
1785     \end{eqnarray}
1786    
1787     which leads to
1788    
1789     \begin{equation}
1790     \label{eq:lem:ccil0:sidv0:sgdu0:02:17}
1791     \frac{u_n b + u_{n-1}}{v_{n-1}}
1792     - \frac{u+1}{v}
1793     < 2 .
1794     \end{equation}
1795    
1796     In order to maximize the left-hand side of
1797     (\ref{eq:lem:ccil0:sidv0:sgdu0:02:17}), we assume that we
1798     estimate $u$ exactly so that $u = u_n b^n + u_{n-1} b^{n-1}$,
1799     yielding
1800    
1801     \begin{equation}
1802     \label{eq:lem:ccil0:sidv0:sgdu0:02:18}
1803     \frac{u}{v_{n-1} b^{n-1}}
1804     - \frac{u+1}{v}
1805     < 2 .
1806     \end{equation}
1807    
1808     We also assume that $u$ is the maximum value
1809     possible, $u=bv-1$, leading to
1810    
1811     \begin{equation}
1812     \label{eq:lem:ccil0:sidv0:sgdu0:02:19}
1813     \frac{bv-1}{v_{n-1} b^{n-1}}
1814     - b
1815     < 2 .
1816     \end{equation}
1817    
1818     Finally, we assume that $v$ is the upper limit in
1819     (\ref{eq:lem:ccil0:sidv0:sgdu0:02:14}),
1820     $v=b^n/2 + b^{n-1}/2 - 1$, and substitute the known value of
1821     $v_{n-1}$ for the case being proved, $v_{n-1} = b/2-1/2$, yielding
1822    
1823     \begin{equation}
1824     \label{eq:lem:ccil0:sidv0:sgdu0:02:20}
1825     \frac{b \left( \frac{b^n}{2} + \frac{b^{n-1}}{2} - 1 \right) - 1}
1826     {\left( \frac{b}{2} - \frac{1}{2} \right) b^{n-1}}
1827     - b
1828     < 2 .
1829     \end{equation}
1830    
1831     Simplification of (\ref{eq:lem:ccil0:sidv0:sgdu0:02:20})
1832     will establish that it is always true. This completes the proof.
1833     \end{vworklemmaproof}
1834     \vworklemmafooter{}
1835    
1836     Lemmas \ref{lem:ccil0:sidv0:sgdu0:01} and
1837     \ref{lem:ccil0:sidv0:sgdu0:02},
1838     standing alone, lead to a good implementation of
1839     division without any further results. If it is known that
1840     $0 \leq \hat{q} - q \leq 2$, Algorithm \ref{alg:ccil0:sidv0:sgdu0:01}
1841     can be trivially modified to only calculate
1842     $\hat{q}$ (omitting the additional tests in Step \ref{enumstep:alg:ccil0:sidv0:sgdu0:01:03}),
1843     and then
1844     to include up to two add-back steps
1845     (duplication of Step \ref{enumstep:alg:ccil0:sidv0:sgdu0:01:06}).
1846     Although such an algorithm would be
1847     satisfactory, it has the disadvantage that the add-back steps would
1848     be executed very frequently, slowing the algorithm substantially, especially
1849     for long operands.
1850     We now show that the additional tests in Step \ref{enumstep:alg:ccil0:sidv0:sgdu0:01:03} of
1851     Algorithm \ref{alg:ccil0:sidv0:sgdu0:01} can eliminate
1852     altogether the case of $\hat{q}-q = 2$ (Lemma \ref{lem:ccil0:sidv0:sgdu0:03}), and
1853     can with a probability close to unity eliminate the
1854     case of $\hat{q}-q = 1$ (Lemmas \ref{lem:ccil0:sidv0:sgdu0:04}
1855     and \ref{lem:ccil0:sidv0:sgdu0:05}). Together these tests, which are present in
1856     the statement of Algorithm \ref{alg:ccil0:sidv0:sgdu0:01},
1857     reduce add-back (Step \ref{enumstep:alg:ccil0:sidv0:sgdu0:01:06}) to rare occurrence, and create a more
1858     efficient algorithm than would be possible with the
1859     results of Lemmas \ref{lem:ccil0:sidv0:sgdu0:01} and \ref{lem:ccil0:sidv0:sgdu0:02} alone.
1860    
1861     \begin{vworklemmastatementpar}
1862     {\mbox{\boldmath$\hat{q} v_{n-2} \leq b \hat{r} + u_{j+n-2} \vworkhimp 0 \leq \hat{q} - q \leq 1$}}
1863     \label{lem:ccil0:sidv0:sgdu0:03}
1864     If the divisor normalization requirement ($v_{n-1} \geq \lfloor b/2 \rfloor$) as specified in
1865     Step \ref{enumstep:alg:ccil0:sidv0:sgdu0:01:01} of
1866     Algorithm \ref{alg:ccil0:sidv0:sgdu0:01} is met, then
1867    
1868     \begin{equation}
1869     \label{eq:lem:ccil0:sidv0:sgdu0:03:01}
1870     \hat{q} v_{n-2} \leq b \hat{r} + u_{j+n-2} \vworkhimp 0 \leq \hat{q} - q \leq 1 .
1871     \end{equation}
1872     \end{vworklemmastatementpar}
1873     \begin{vworklemmaproof}
1874     For reference, note that:
1875    
1876     \begin{eqnarray}
1877     \label{eq:lem:ccil0:sidv0:sgdu0:03:02}
1878     u & = & u_{j+n} b^{j+n} + u_{j+n-1} b^{j+n-1} + \ldots{} + u_1 b + u_0 \\
1879     \label{eq:lem:ccil0:sidv0:sgdu0:03:03}
1880     v & = & v_{n-1} b^{n-1} + v_{n-2} b^{n-2} + \ldots{} + v_1 b + v_0
1881     \end{eqnarray}
1882    
1883     By definition, we the remainder
1884     $\hat{r}$ has the value
1885     $\hat{r} = u_{j+n} b + u_{j+n-1} - \hat{q} v_{n-1}$. Substituting this value
1886     into (\ref{eq:lem:ccil0:sidv0:sgdu0:03:01}) produces
1887    
1888     \begin{equation}
1889     \label{eq:lem:ccil0:sidv0:sgdu0:03:04}
1890     \hat{q} v_{n-2} \leq b (u_{j+n} b + u_{j+n-1} - \hat{q} v_{n-1}) + u_{j+n-2} ,
1891     \end{equation}
1892    
1893     and solving for $\hat{q}$ yields
1894    
1895     \begin{equation}
1896     \label{eq:lem:ccil0:sidv0:sgdu0:03:05}
1897     \hat{q} \leq \frac{u_{j+n} b^2 + u_{j+n-1}b + u_{j+n-2}}{v_{n-1}b + v_{n-2}}.
1898     \end{equation}
1899    
1900     It is known from Lemma \ref{lem:ccil0:sidv0:sgdu0:01} that the type of estimate
1901     represented by the floor of the right-hand size of (\ref{eq:lem:ccil0:sidv0:sgdu0:03:05})
1902     can be no less than $q$, leading to
1903    
1904     \begin{eqnarray}
1905     \label{eq:lem:ccil0:sidv0:sgdu0:03:06}
1906     & \displaystyle q \leq \hat{q}
1907     \leq
1908     \left\lfloor { \frac{u_{j+n} b^2 + u_{j+n-1}b + u_{j+n-2}}{v_{n-1}b + v_{n-2}} } \right\rfloor & \\
1909     \nonumber & \displaystyle \leq
1910     \frac{u_{j+n} b^2 + u_{j+n-1}b + u_{j+n-2}}{v_{n-1}b + v_{n-2}}. &
1911     \end{eqnarray}
1912    
1913     Because $q, \hat{q} \in \vworkintset$, it is only necessary to prove that
1914    
1915     \begin{equation}
1916     \label{eq:lem:ccil0:sidv0:sgdu0:03:07}
1917     \frac{u_{j+n} b^2 + u_{j+n-1}b + u_{j+n-2}}{v_{n-1}b + v_{n-2}} -
1918     \left\lfloor \frac{u}{v} \right\rfloor
1919     < 2
1920     \end{equation}
1921    
1922     in order to prove that $\hat{q}-q \leq 1$. Using
1923     (\cmtnzeroxrefhyphen\ref{eq:cmtn0:sfcf0:02}),
1924     (\ref{eq:lem:ccil0:sidv0:sgdu0:03:07}) can be rewritten as
1925    
1926     \begin{equation}
1927     \label{eq:lem:ccil0:sidv0:sgdu0:03:08}
1928     \frac{u_{j+n} b^2 + u_{j+n-1}b + u_{j+n-2}}{v_{n-1}b + v_{n-2}} -
1929     \frac{u}{v} -
1930     \frac{u \bmod v}{v}
1931     < 2 .
1932     \end{equation}
1933    
1934     In order for implication to hold, we must make the most pessimistic
1935     assumptions about $u \bmod v$ (those which maximize it). The maximum value
1936     of $u \bmod v$ is $v-1$, leading to
1937    
1938     \begin{equation}
1939     \label{eq:lem:ccil0:sidv0:sgdu0:03:09}
1940     \frac{u_{j+n} b^2 + u_{j+n-1}b + u_{j+n-2}}{v_{n-1}b + v_{n-2}} -
1941     \frac{u + 1}{v}
1942     < 1 .
1943     \end{equation}
1944    
1945     In order to maximize the left side of (\ref{}),
1946     we must assume that $u$ is maximized, $v$ is minimized,
1947    
1948    
1949     \end{vworklemmaproof}
1950     \vworklemmafooter{}
1951    
1952     \begin{vworklemmastatementpar}
1953     {\mbox{\boldmath$\hat{q} v_{n-2} > b \hat{r} + u_{n-2} \vworkhimp q < \hat{q}$}}
1954     \label{lem:ccil0:sidv0:sgdu0:04}
1955     Given $\hat{q} > 0$, an estimate of $q$, and the remainder
1956     based on the estimate, $\hat{r} = u_n b + u_{n-1} - \hat{q} v_{n-1}$,
1957    
1958     \begin{equation}
1959     \label{eq:lem:ccil0:sidv0:sgdu0:04:01}
1960     \hat{q} v_{n-2} > b \hat{r} + u_{n-2} \vworkhimp \hat{q} > q .
1961     \end{equation}
1962     \end{vworklemmastatementpar}
1963     \begin{vworklemmaproof}
1964     We make the assumption that $v_{n-1}$ and $v_{n-2}$ are not both 0.
1965     $v_{n-1} > 0$ is guaranteed by
1966     the normalization of
1967     $v$ in Algorithm \ref{alg:ccil0:sidv0:sgdu0:01}.
1968    
1969     \begin{equation}
1970     \label{eq:lem:ccil0:sidv0:sgdu0:04:02}
1971     \hat{q} v_{n-2} > b \hat{r} + u_{n-2}
1972     \end{equation}
1973    
1974     \begin{equation}
1975     \label{eq:lem:ccil0:sidv0:sgdu0:04:03}
1976     \hat{q} v_{n-2} > b (u_n b + u_{n-1} - \hat{q} v_{n-1}) + u_{n-2}
1977     \end{equation}
1978    
1979     Solving (\ref{eq:lem:ccil0:sidv0:sgdu0:04:03}) for $\hat{q}$ yields
1980    
1981     \begin{equation}
1982     \label{eq:lem:ccil0:sidv0:sgdu0:04:04}
1983     \hat{q}
1984     >
1985     \frac{u_n b^2 + u_{n-1} b + u_{n-2}}{v_{n-1} b + v_{n-2}}
1986     \geq
1987     \left\lfloor {\frac{u_n b^2 + u_{n-1} b + u_{n-2}}{v_{n-1} b + v_{n-2}}} \right\rfloor
1988     .
1989     \end{equation}
1990    
1991     Note that the right-hand term of
1992     (\ref{eq:lem:ccil0:sidv0:sgdu0:04:04})
1993     is similar in form to the estimate $\hat{q}$ in
1994     Lemma \ref{lem:ccil0:sidv0:sgdu0:01}, where it is proved that
1995     $\hat{q} \geq q$. It is possible to use identical algebraic technique
1996     as is used in Lemma \ref{lem:ccil0:sidv0:sgdu0:01} in order to prove that
1997    
1998     \begin{equation}
1999     \label{eq:lem:ccil0:sidv0:sgdu0:04:05}
2000     \left\lfloor {\frac{u_n b^2 + u_{n-1} b + u_{n-2}}{v_{n-1} b + v_{n-2}}} \right\rfloor
2001     \geq q,
2002     \end{equation}
2003    
2004     and it follows that
2005    
2006     \begin{equation}
2007     \label{eq:lem:ccil0:sidv0:sgdu0:04:06}
2008     \hat{q}
2009     >
2010     \frac{u_n b^2 + u_{n-1} b + u_{n-2}}{v_{n-1} b + v_{n-2}}
2011     \geq
2012     \left\lfloor {\frac{u_n b^2 + u_{n-1} b + u_{n-2}}{v_{n-1} b + v_{n-2}}} \right\rfloor
2013     \geq q,
2014     \end{equation}
2015    
2016     and thus $\hat{q} > q$.
2017     \end{vworklemmaproof}
2018     \vworklemmafooter{}
2019    
2020     \begin{vworklemmastatementpar}
2021     {Add-back occurs with approximate probability \mbox{\boldmath$2/b$}}
2022     \label{lem:ccil0:sidv0:sgdu0:05}
2023     The estimate of $q$ provided by (\ref{eq:ccil0:sidv0:sgdu0:01}),
2024     \end{vworklemmastatementpar}
2025     \begin{vworklemmaproof}
2026     \end{vworklemmaproof}
2027     \vworklemmafooter{}
2028    
2029    
2030     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2031     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2032     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2033     \subsection{Division Of Signed Operands}
2034    
2035    
2036     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2037     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2038     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2039     \subsection{Large Dividends With Machine-Native Divisors}
2040     \label{ccil0:sidv0:sldm0}
2041    
2042     Division of arbitrary-sized operands (Section \ref{ccil0:sidv0:sgdu0}) is
2043     a costly operation. In many practical applications, we are able to exploit
2044     data sizes of operands or special relationships between the values of
2045     operands to use the instruction set of the machine more effectively.
2046     In this subsection, we investigate what optimizations we may achieve when:
2047    
2048     \begin{itemize}
2049     \item We wish to calculate the quotient and remainder of
2050     unsigned integers $p$ and $q$: $p/q$ and
2051     $p \bmod{} q$; \emph{and}
2052     \item The machine possesses unsigned division instructions
2053     which provide both a quotient and a remainder from
2054     a division; \emph{and}
2055     \item The bitsize of the divisor $q$ is not larger than can
2056     be accomodated (as a divisor) by machine division instructions.
2057     \end{itemize}
2058    
2059     Processors which possess integer division instructions usually
2060     possess one of two types of instructions:
2061    
2062     \begin{itemize}
2063     \item Instructions where the the divisor, quotient and remainder are
2064     $Q$ bits, but the dividend is $2Q$ bits (we call these
2065     ``large dividend'' instructions). For example, an
2066     instruction which accepts a 16-bit dividend and an
2067     8-bit divisor to produce an 8-bit quotient and an 8-bit remainder is
2068     typical.
2069     With such instructions, overflow is possible, and is always detectable.
2070     However, in this subsection we never describe algorithms which detect
2071     overflow---instead, we arrange for data values which cannot generate an
2072     overflow.
2073     \item Instructions where the dividend, divisor, quotient, and remainder
2074     are all $Q$ bits (we call these ``small dividend'' instructions).
2075     With such instructions, overflow is not possible.
2076     \end{itemize}
2077    
2078     We call the bitsize $Q$ a \emph{chunk}. We use \emph{chunk} rather than
2079     \emph{word} because the chunksize and wordsize in general are not
2080     required to be the same.
2081    
2082     For the remainder of this discussion, we assume large dividend
2083     instructions (the first category above).
2084     The algorithms developed can be implemented on small dividend machines
2085     by halving data sizes so that the divisor fills no more than half
2086     of the available bits.
2087    
2088     We assume that we are interested in calculating the integer quotient
2089     $\lfloor{}p/q\rfloor$ and remainder $p \bmod{} q$ of two unsigned
2090     integers $p$ and $q$, where $p$ is of size $P$ bits and $q$ is
2091     of size $Q$ bits. For simplicity and without detracting from the
2092     generality of the solution, we assume that $Q \vworkdivides{} P$.
2093    
2094     We then seek to calculate
2095    
2096     \begin{eqnarray}
2097     \label{eq:ccil0:sidv0:sldm0:001}
2098     \frac{p}{q} & = & \frac{2^{P-Q} p_{[P/Q-1]} + 2^{P-2Q} p_{[P/Q-2]} + \ldots{} + 2^{Q} p_{[1]} + p_{[0]}}{q_{[0]}} \\
2099     \nonumber & = & \frac{\sum_{i=0}^{P/Q-1} 2^{iQ} p_{[i]}}{q_{[0]}} .
2100     \end{eqnarray}
2101    
2102     \noindent{}Using the integer identity
2103    
2104     \begin{equation}
2105     \label{eq:ccil0:sidv0:sldm0:002}
2106     \frac{a}{b} = \left\lfloor{\frac{a}{b}}\right\rfloor + \frac{a \bmod b}{b} ,
2107     \end{equation}
2108    
2109     \noindent{}we can reform (\ref{eq:ccil0:sidv0:sldm0:001}) into
2110    
2111     \begin{eqnarray}
2112     \nonumber
2113     \frac{p}{q} & = & 2^{P-Q} \left\lfloor{\frac{p_{[P/Q-1]}}{q_{[0]}}}\right\rfloor \\
2114     \label{eq:ccil0:sidv0:sldm0:003}
2115     & + & 2^{P-Q} \frac{p_{[P/Q-1]}\bmod q_{[0]}}{q_{[0]}}
2116     + 2^{P-2Q} \frac{p_{[P/Q-2]}}{q_{[0]}} \\
2117     \nonumber & + & \frac{\sum_{i=0}^{P/Q-3} 2^{iQ} p_{[i]}}{q_{[0]}} ,
2118     \end{eqnarray}
2119    
2120     \noindent{}which can be polished slightly to yield
2121    
2122     \begin{eqnarray}
2123     \nonumber
2124     \frac{p}{q} & = & 2^{P-Q} \left\lfloor{\frac{p_{[P/Q-1]}}{q_{[0]}}}\right\rfloor \\
2125     \label{eq:ccil0:sidv0:sldm0:004}
2126     & + & 2^{P-2Q} \frac{2^Q (p_{[P/Q-1]}\bmod q_{[0]}) + p_{[P/Q-2]}}{q_{[0]}} \\
2127     \nonumber & + & \frac{\sum_{i=0}^{P/Q-3} 2^{iQ} p_{[i]}}{q_{[0]}} .
2128     \end{eqnarray}
2129    
2130     Note in (\ref{eq:ccil0:sidv0:sldm0:004}) that the first term,
2131     $\lfloor{}p_{[P/Q-1]} / q_{[0]}\rfloor$, as well as
2132     a portion of the second term, $p_{[P/Q-1]}\bmod q_{[0]}$, can be
2133     calculated using a single machine division instruction with
2134     $p_{[P/Q-1]}$ as the dividend and $q_{[0]}$ as the divisor.
2135     Note also that multiplication of an integer by a power of 2
2136     can be achieved by placing the integer correctly within the
2137     result. In this regard note that $Q=8$ or $Q=16$ are
2138     the most typical cases, and so the placement can be achieved simply
2139     by selecting the correct memory address.
2140    
2141     It is initially unclear whether we can evaluate or reduce the fraction in the
2142     second term of (\ref{eq:ccil0:sidv0:sldm0:004}),
2143     $[2^Q (p_{[P/Q-1]}\bmod q_{[0]}) + p_{[P/Q-2]}] / q_{[0]}$,
2144     using a single large dividend machine instruction, because
2145     the upper chunk of the dividend is populated with non-zero bits
2146     (specifically, $p_{[P/Q-1]}\bmod q_{[0]}$), and it seems that
2147     a division overflow may be possible. However, with some thought,
2148     it is clear that $p_{[P/Q-1]}\bmod q_{[0]} \leq q_{[0]} - 1$ and
2149     $p_{[P/Q-2]} \leq 2^Q - 1$, thus the largest numerator possible
2150     is $2^Q q_{[0]} - 1$, which, when divided by $q_{[0]}$, will result
2151     in a quotient and remainder of $2^Q - 1$. Thus, no division overflow
2152     can occur, and the fraction in the
2153     second term of (\ref{eq:ccil0:sidv0:sldm0:004}) can be evaluated
2154     using a large divisor integer machine instruction.
2155    
2156     The fraction in the
2157     second term of (\ref{eq:ccil0:sidv0:sldm0:004}) can be simplified
2158     using (\ref{eq:ccil0:sidv0:sldm0:002}) to yield:
2159    
2160     \begin{eqnarray}
2161     \nonumber
2162     \frac{p}{q} & = & 2^{P-Q} \left\lfloor{\frac{p_{[P/Q-1]}}{q_{[0]}}}\right\rfloor \\
2163     \label{eq:ccil0:sidv0:sldm0:005}
2164     & + & 2^{P-2Q} \left\lfloor{\frac{2^Q (p_{[P/Q-1]}\bmod q_{[0]}) + p_{[P/Q-2]}}{q_{[0]}}}\right\rfloor \\
2165     \nonumber & + & 2^{P-2Q} \frac{(2^Q (p_{[P/Q-1]}\bmod q_{[0]}) + p_{[P/Q-2]}) \bmod q_{[0]}}{q_{[0]}} \\
2166     \nonumber & + & \frac{\sum_{i=0}^{P/Q-3} 2^{iQ} p_{[i]}}{q_{[0]}} .
2167     \end{eqnarray}
2168    
2169     The process of combining adjacent terms can be continued until all
2170     divisions and modulo operations necessary can be carried out using
2171     long dividend division instructions. If we envision a
2172     long-dividend division instruction as a functional block that
2173     accepts a $2Q$-bit dividend and a $Q$-bit divisor to produce a
2174     $Q$-bit quotient and a $Q$-bit remainder
2175     (Figure \ref{fig:ccil0:sidv0:sldm0:00}), then we can draw the
2176     entire division as outlined by (\ref{eq:ccil0:sidv0:sldm0:005})
2177     as shown in Figure \ref{fig:ccil0:sidv0:sldm0:01}.
2178    
2179     \begin{figure}
2180     \centering
2181     \includegraphics[width=4.6in]{c_cil0/lddvblk.eps}
2182     \caption{Long Dividend Division Machine Instruction As A Functional Block}
2183     \label{fig:ccil0:sidv0:sldm0:00}
2184     \end{figure}
2185    
2186     \begin{figure}
2187     \centering
2188     \includegraphics[width=4.6in]{c_cil0/ldmnblk.eps}
2189     \caption{Long Dividend/Machine-Native Divisor Division In Functional Block Form}
2190     \label{fig:ccil0:sidv0:sldm0:01}
2191     \end{figure}
2192    
2193     The following example illustrates how to apply the technique.
2194    
2195     \begin{vworkexamplestatement}
2196     \label{ex:ccil0:sidv0:sldm0:01}
2197     Implement 32/8 unsigned division on the TMS370C8 processor, which is
2198     characterized by a 16/8 division instruction.
2199     \end{vworkexamplestatement}
2200     \begin{vworkexampleparsection}{Solution}
2201     It would be possible to prepare an implementation directly from
2202     Figure \ref{fig:ccil0:sidv0:sldm0:01}: however, it may be
2203     more instructive to work through a solution without the
2204     aid of this figure.
2205    
2206     In the case of the TMS370C8, the chunk size $Q$ is 8 bits; therefore
2207     $Q=8$. The problem statement indicates that we must accept 32-bit dividends;
2208     therefore $P=32$. Thus
2209    
2210     \begin{equation}
2211     \label{eq:ex:ccil0:sidv0:sldm0:01:001}
2212     p = 2^{24} p_{[3]} + 2^{16} p_{[2]} + 2^{8} p_{[1]} + p_{[0]}
2213     \end{equation}
2214    
2215     \noindent{}and
2216    
2217     \begin{equation}
2218     \label{eq:ex:ccil0:sidv0:sldm0:01:002}
2219     q = q_{[0]} .
2220     \end{equation}
2221    
2222     \noindent{}Thus the quotient and remainder we would like to determine,
2223     $\lfloor p/q \rfloor$ and $p \bmod q$, can be obtained by repeated
2224     application of (\ref{eq:ccil0:sidv0:sldm0:002}) as shown
2225     in Equations (\ref{eq:ex:ccil0:sidv0:sldm0:01:003})
2226     through (\ref{eq:ex:ccil0:sidv0:sldm0:01:011}).
2227    
2228     \begin{equation}
2229     \label{eq:ex:ccil0:sidv0:sldm0:01:003}
2230     \frac{p}{q}
2231     =
2232     \frac{2^{24} p_{[3]} + 2^{16} p_{[2]} + 2^{8} p_{[1]} + p_{[0]}}{q_{[0]}}
2233     \end{equation}
2234    
2235     \begin{equation}
2236     \label{eq:ex:ccil0:sidv0:sldm0:01:004}
2237     \frac{p}{q}
2238     =
2239     2^{24} \frac{p_{[3]}}{q_{[0]}}
2240     +
2241     2^{16} \frac{p_{[2]}}{q_{[0]}}
2242     +
2243     2^{8} \frac{p_{[1]}}{q_{[0]}}
2244     +
2245     \frac{p_{[0]}}{q_{[0]}}
2246     \end{equation}
2247    
2248     \begin{equation}
2249     \label{eq:ex:ccil0:sidv0:sldm0:01:005}
2250     \frac{p}{q}
2251     =
2252     2^{24} \left\lfloor{\frac{p_{[3]}}{q_{[0]}}}\right\rfloor
2253     +
2254     2^{24} \frac{(p_{[3]} \bmod q_{[0]})}{q_{[0]}}
2255     +
2256     2^{16} \frac{p_{[2]}}{q_{[0]}}
2257     +
2258     2^{8} \frac{p_{[1]}}{q_{[0]}}
2259     +
2260     \frac{p_{[0]}}{q_{[0]}}
2261     \end{equation}
2262    
2263     \begin{equation}
2264     \label{eq:ex:ccil0:sidv0:sldm0:01:006}
2265     \frac{p}{q}
2266     =
2267     2^{24} \left\lfloor{\frac{p_{[3]}}{q_{[0]}}}\right\rfloor
2268     +
2269     2^{16} \frac{2^8 (p_{[3]} \bmod q_{[0]}) + p_{[2]}}{q_{[0]}}
2270     +
2271     2^{8} \frac{p_{[1]}}{q_{[0]}}
2272     +
2273     \frac{p_{[0]}}{q_{[0]}}
2274     \end{equation}
2275    
2276     \begin{eqnarray}
2277     \label{eq:ex:ccil0:sidv0:sldm0:01:007}
2278     \frac{p}{q} & = & 2^{24} \left\lfloor{\frac{p_{[3]}}{q_{[0]}}}\right\rfloor
2279     +
2280     2^{16} \left\lfloor{\frac{2^8 (p_{[3]} \bmod q_{[0]}) + p_{[2]}}{q_{[0]}}}\right\rfloor \\
2281     \nonumber & + &
2282     2^{16} \frac{(2^8 (p_{[3]} \bmod q_{[0]}) + p_{[2]}) \bmod q_{[0]}}{q_{[0]}}
2283     +
2284     2^{8} \frac{p_{[1]}}{q_{[0]}}
2285     +
2286     \frac{p_{[0]}}{q_{[0]}}
2287     \end{eqnarray}
2288    
2289     \begin{eqnarray}
2290     \label{eq:ex:ccil0:sidv0:sldm0:01:008}
2291     \frac{p}{q} & = & 2^{24} \left\lfloor{\frac{p_{[3]}}{q_{[0]}}}\right\rfloor
2292     +
2293     2^{16} \left\lfloor{\frac{2^8 (p_{[3]} \bmod q_{[0]}) + p_{[2]}}{q_{[0]}}}\right\rfloor \\
2294     \nonumber & + &
2295     2^{8} \frac{2^8((2^8 (p_{[3]} \bmod q_{[0]}) + p_{[2]}) \bmod q_{[0]}) + p_{[1]}}{q_{[0]}}
2296     +
2297     \frac{p_{[0]}}{q_{[0]}}
2298     \end{eqnarray}
2299    
2300     \begin{eqnarray}
2301     \nonumber\frac{p}{q} & = & 2^{24} \left\lfloor{\frac{p_{[3]}}{q_{[0]}}}\right\rfloor
2302     +
2303     2^{16} \left\lfloor{\frac{2^8 (p_{[3]} \bmod q_{[0]}) + p_{[2]}}{q_{[0]}}}\right\rfloor \\
2304     \label{eq:ex:ccil0:sidv0:sldm0:01:009}
2305     & + &
2306     2^{8} \left\lfloor{\frac{2^8((2^8 (p_{[3]} \bmod q_{[0]}) + p_{[2]}) \bmod q_{[0]}) + p_{[1]}}{q_{[0]}}}\right\rfloor \\
2307     \nonumber & + &
2308     2^{8} \frac{(2^8((2^8 (p_{[3]} \bmod q_{[0]}) + p_{[2]}) \bmod q_{[0]}) + p_{[1]}) \bmod q_{[0]}}{q_{[0]}} \\
2309     \nonumber & + &
2310     \frac{p_{[0]}}{q_{[0]}}
2311     \end{eqnarray}
2312    
2313     \begin{eqnarray}
2314     \nonumber\frac{p}{q} & = & 2^{24} \left\lfloor{\frac{p_{[3]}}{q_{[0]}}}\right\rfloor
2315     +
2316     2^{16} \left\lfloor{\frac{2^8 (p_{[3]} \bmod q_{[0]}) + p_{[2]}}{q_{[0]}}}\right\rfloor \\
2317     \label{eq:ex:ccil0:sidv0:sldm0:01:010}
2318     & + &
2319     2^{8} \left\lfloor{\frac{2^8((2^8 (p_{[3]} \bmod q_{[0]}) + p_{[2]}) \bmod q_{[0]}) + p_{[1]}}{q_{[0]}}}\right\rfloor \\
2320     \nonumber & + &
2321     \frac{2^8((2^8((2^8 (p_{[3]} \bmod q_{[0]}) + p_{[2]}) \bmod q_{[0]}) + p_{[1]}) \bmod q_{[0]}) + p_{[0]}}{q_{[0]}}
2322     \end{eqnarray}
2323    
2324     \begin{eqnarray}
2325     \nonumber & \displaystyle \frac{p}{q} = 2^{24} \left\lfloor{\frac{p_{[3]}}{q_{[0]}}}\right\rfloor
2326     +
2327     2^{16} \left\lfloor{\frac{2^8 (p_{[3]} \bmod q_{[0]}) + p_{[2]}}{q_{[0]}}}\right\rfloor & \\
2328     \label{eq:ex:ccil0:sidv0:sldm0:01:011}
2329     & \displaystyle +
2330     2^{8} \left\lfloor{\frac{2^8((2^8 (p_{[3]} \bmod q_{[0]}) + p_{[2]}) \bmod q_{[0]}) + p_{[1]}}{q_{[0]}}}\right\rfloor & \\
2331     \nonumber & \displaystyle +
2332     \left\lfloor{\frac{2^8((2^8((2^8 (p_{[3]} \bmod q_{[0]}) + p_{[2]}) \bmod q_{[0]}) + p_{[1]}) \bmod q_{[0]}) + p_{[0]}}{q_{[0]}}}\right\rfloor + & \\
2333     \nonumber
2334     & \displaystyle \frac{(2^8((2^8((2^8 (p_{[3]} \bmod q_{[0]}) + p_{[2]}) \bmod q_{[0]}) + p_{[1]}) \bmod q_{[0]}) + p_{[0]}) \bmod q_{[0]}}{q_{[0]}}
2335     &
2336     \end{eqnarray}
2337    
2338     Note several things about the implementation suggested by
2339     (\ref{eq:ex:ccil0:sidv0:sldm0:01:011}):
2340    
2341     \begin{itemize}
2342     \item No addition or multiplication is required to calculate terms such as
2343     $2^8 (p_{[3]} \bmod q_{[0]}) + p_{[2]}$. The high-order byte of the
2344     large dividend can be stuffed with $p_{[3]} \bmod q_{[0]}$ and
2345     the low-order byte with $p_{[2]}$.
2346     \item No addition or multiplication is required to calculate the
2347     result $\lfloor p/q \rfloor$.
2348     Note in (\ref{eq:ex:ccil0:sidv0:sldm0:01:011}) that the results are
2349     conveniently grouped as bytes with multipliers of $2^{24}$,
2350     $2^{16}$, $2^8$, and $2^0=1$. The terms can simply be placed into
2351     the appropriate byte, as a way of multplication by the appropriate
2352     power of 2. Note also that each term is guaranteed to be
2353     $\in \{0, 1, 2, \ldots{} , 255\}$, by the argument presented
2354     earlier for (\ref{eq:ccil0:sidv0:sldm0:004}). Thus, the
2355     addition will result in no carries, and each result byte can simply
2356     be placed directly in the correct memory location---addition is
2357     not necessary.
2358     \item Four machine division instructions are required, and the remainder
2359     is produced automatically by the fourth instruction.
2360     \end{itemize}
2361    
2362     An implemenation for the TMS370C8 is supplied as Figure
2363     \ref{fig:ex:ccil0:sidv0:sldm0:01:01}. A block diagram of the data
2364     flow for this implementation is supplied as
2365     Figure \ref{fig:ex:ccil0:sidv0:sldm0:01:02}.
2366     \end{vworkexampleparsection}
2367     \vworkexamplefooter{}
2368    
2369     \begin{figure}
2370     \begin{verbatim}
2371     ;Assume that byte memory locations p3, p2, p1, and p0 contain the
2372     ;32-bit unsigned dividend, and byte q0 contains the 8-bit unsigned
2373     ;divisor. Assume also that the result quotient will be placed
2374     ;in byte memory locations d3, d2, d1, and d0; and that the
2375     ;remainder will be placed in the byte memory location r0. Further
2376     ;assume that all memory locations are in the register file (near).
2377     CLR A ;High-order chunk of large divisor
2378     ;must be 0.
2379     MOV p3, B ;Load the low-order chunk of divisor.
2380     DIV q0, A ;Perform the first division.
2381     MOV A, d3 ;Quotient becomes this part of the
2382     ;result.
2383     MOV B, A ;Remainder becomes high-order chunk of
2384     ;next division.
2385     MOV p2, B ;Next byte becomes low-order chunk.
2386     DIV q0, A ;Do the second division.
2387     MOV A, d2 ;Quotient becomes this part of the
2388     ;result.
2389     MOV B, A ;Remainder becomes high-order chunk of
2390     ;next division.
2391     MOV p1, B ;Next byte becomes low-order chunk.
2392     DIV q0, A ;Do the third division.
2393     MOV A, d1 ;Quotient becomes this part of the
2394     ;result.
2395     MOV B, A ;Remainder becomes high-order chunk of
2396     ;next division.
2397     MOV p0, B ;Next byte becomes low-order chunk.
2398     DIV q0, A ;Do the fourth division.
2399     MOV A, d0 ;Quotient becomes this part of the
2400     ;result.
2401     MOV B, r0 ;This is the remainder, which could be used
2402     ;for rounding.
2403     \end{verbatim}
2404     \caption{TMS370C8 Code Snippet Illustrating Unsigned 32/8
2405     Division Using Unsigned 16/8
2406     Machine Instructions (Example \ref{ex:ccil0:sidv0:sldm0:01})}
2407     \label{fig:ex:ccil0:sidv0:sldm0:01:01}
2408     \end{figure}
2409    
2410     \begin{figure}
2411     \centering
2412     \includegraphics[width=4.6in]{c_cil0/t370dmp.eps}
2413     \caption{Block Diagram Of Data Flow Of Figure \ref{fig:ex:ccil0:sidv0:sldm0:01:01}}
2414     \label{fig:ex:ccil0:sidv0:sldm0:01:02}
2415     \end{figure}
2416    
2417    
2418     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2419     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2420     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2421     \section{Miscellaneous Integer Mappings}
2422     %Section tag: MIM0
2423     \label{ccil0:smim0}
2424    
2425     Embedded system work and ROM constraints often inspire a great deal
2426     of cleverness in the selection of instructions to perform mappings or
2427     tests. In this section, we discuss integer mappings (i.e. functions)
2428     for which economical implementations are known; and in the next section
2429     (Section \ref{ccil0:smit0})
2430     we discuss integer tests for which economical implementations are known.
2431    
2432     To the best of our knowledge, there is no way to derive these mappings
2433     and tests---they have been collected from many software developers and
2434     come from human intuition and experience.
2435    
2436    
2437     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2438     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2439     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2440     \subsection{Lowest-Order Bit}
2441     %Subsection tag: LIB0
2442     \label{ccil0:smim0:slib0}
2443    
2444     \index{lowest-order bit}
2445     \index{least significant bit}
2446    
2447     The mapping
2448    
2449     \texttt{mask = x \& -x}
2450    
2451     \noindent{}is the most economical way known to extract the
2452     lowest-order bit set in an integer \texttt{x}, or
2453     0 if no bits are set.\footnote{This mapping was contributed by
2454     David Baker (\texttt{bakerda@engin.umich.edu})
2455     and Raul Selgado (\texttt{rselgado@visteon.com}).} Since most processors have an instruction to form the
2456     two's complement of an integer, this mapping usually requires only
2457     two arithmetic instructions.
2458    
2459     When implementing this mapping in assembly-language on processors without a
2460     two's complement instruction, two other possible implementations are:
2461    
2462     \begin{itemize}
2463     \item \texttt{mask = x \& ($\sim$x + 1)}
2464     \item \texttt{mask = x \& ((x \^{ } -1) + 1)}
2465     \end{itemize}
2466    
2467    
2468     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2469     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2470     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2471     \section{Miscellaneous Integer Tests}
2472     %Section tag: MIT0
2473     \label{ccil0:smit0}
2474    
2475     \subsection{Power Of 2}
2476     %Subsection tag: PTW0
2477     \label{ccil0:smit0:sptw0}
2478    
2479     \index{power of two}
2480     \index{2N@$2^N$}
2481    
2482     The test
2483    
2484     \texttt{(x \& (x-1) == 0) \&\& (x != 0)}
2485    
2486     \noindent{}is the most economical way known to
2487     test whether an integer is a positive power of two
2488     (1, 2, 4, 8, 16, etc.).\footnote{The test appeared as part of
2489     a discussion on
2490     the GMP mailing list in 2002.}
2491    
2492    
2493     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2494     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2495     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2496     \section{Exercises}
2497    
2498     \begin{vworkexercisestatement}
2499     \label{exe:ccil0:sexe0:01}
2500     Show that any $m$-bit two's complement integer $u_{[m-1:0]}$ except
2501     $-2^{m-1}$ can be negated by forming the one's complement, then adding one.
2502     \end{vworkexercisestatement}
2503    
2504    
2505    
2506     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2507     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2508     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2509     \vfill
2510     \noindent\begin{figure}[!b]
2511     \noindent\rule[-0.25in]{\textwidth}{1pt}
2512     \begin{tiny}
2513     \begin{verbatim}
2514     $RCSfile: c_cil0.tex,v $
2515     $Source: /home/dashley/cvsrep/e3ft_gpl01/e3ft_gpl01/dtaipubs/esrgubka/c_cil0/c_cil0.tex,v $
2516     $Revision: 1.24 $
2517     $Author: dtashley $
2518     $Date: 2003/11/03 02:14:24 $
2519     \end{verbatim}
2520     \end{tiny}
2521     \noindent\rule[0.25in]{\textwidth}{1pt}
2522     \end{figure}
2523    
2524     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2525     % $Log: c_cil0.tex,v $
2526     % Revision 1.24 2003/11/03 02:14:24 dtashley
2527     % All duplicate labels as flagged by LaTeX removed. Additional files added
2528     % to Microsoft Visual Studio edit context.
2529     %
2530     % Revision 1.23 2002/08/26 17:57:03 dtashley
2531     % Additional solutions chapter added. Precautionary checkin to be sure
2532     % that I've captured all changes.
2533     %
2534     % Revision 1.22 2002/08/25 13:18:21 dtashley
2535     % Edits.
2536     %
2537     % Revision 1.21 2002/08/22 00:33:33 dtashley
2538     % Have made aesthetic changes in CFRY0 and CCFR0. Checking in all before
2539     % rebuild of book.
2540     %
2541     % Revision 1.20 2002/08/21 09:12:11 dtashley
2542     % Safety checkin.
2543     %
2544     % Revision 1.19 2002/08/19 05:06:45 dtashley
2545     % Substantial progress in integer numerics chapter. Preparing to
2546     % work at home.
2547     %
2548     % Revision 1.18 2002/08/10 07:34:48 dtashley
2549     % Checkin before resuming work on a lemma at home.
2550     %
2551     % Revision 1.17 2002/08/09 03:13:42 dtashley
2552     % Significant lemma proved, and other progress.
2553     %
2554     % Revision 1.16 2002/08/06 22:15:24 dtashley
2555     % Substantial lemma proof progress.
2556     %
2557     % Revision 1.15 2002/08/05 01:28:33 dtashley
2558     % Lemma demonstrating that 0 \leq \hat{q}-q \leq 2 completed.
2559     %
2560     % Revision 1.14 2002/08/03 23:04:57 dtashley
2561     % Safety checkin. Having difficulty: may have solved the wrong
2562     % problem.
2563     %
2564     % Revision 1.13 2002/08/01 01:31:24 dtashley
2565     % Safety checkin. Having difficulty completing an alternate version of
2566     % Knuth's proof about the accuracy of quotient estimates based on first
2567     % digits of dividend and divisor.
2568     %
2569     % Revision 1.12 2002/07/31 04:38:31 dtashley
2570     % Edits to basic integer algorithms chapter, safety checkin.
2571     %
2572     % Revision 1.11 2002/07/29 16:30:08 dtashley
2573     % Safety checkin before moving work back to WSU server Kalman.
2574     %
2575     % Revision 1.10 2002/07/26 20:39:43 dtashley
2576     % Safety checkin.
2577     %
2578     % Revision 1.9 2002/07/26 14:58:01 dtashley
2579     % Safety checkin.
2580     %
2581     % Revision 1.8 2002/07/21 16:19:28 dtashley
2582     % Finalization of material about integer division when dividend is
2583     % long but divisor is same as data size that machine can use as
2584     % divisor natively.
2585     %
2586     % Revision 1.7 2002/07/20 23:01:45 dtashley
2587     % Adding material about division with large dividend and machine-native
2588     % divisor.
2589     %
2590     % Revision 1.6 2002/06/11 04:34:19 dtashley
2591     % Information for David Baker added.
2592     %
2593     % Revision 1.5 2002/06/08 05:50:25 dtashley
2594     % Added missing tilde. Can't get it to be same size as other
2595     % characters--need to research that.
2596     %
2597     % Revision 1.4 2002/06/07 02:08:32 dtashley
2598     % Section added for integer mappings and tests. Mapping for lowest-order
2599     % bit set from Raul Selgado and Dave (last name presently unknown)
2600     % at Visteon added. Test for power of 2 added.
2601     %
2602     % Revision 1.3 2001/08/31 23:11:17 dtashley
2603     % End of August 2001 safety check-in.
2604     %
2605     % Revision 1.2 2001/08/27 20:06:08 dtashley
2606     % Edits and substantial re-organization.
2607     %
2608     % Revision 1.1 2001/08/25 22:51:25 dtashley
2609     % Complex re-organization of book.
2610     %
2611     %End of file C_CIL0.TEX

dashley@gmail.com
ViewVC Help
Powered by ViewVC 1.1.25