blob: a06e73b85c54b32a02b04f1fc2e41a62c67002a0 [file] [log] [blame]
Hans Boehm50f1bac2015-08-11 19:23:02 -07001<!doctype html>
2<html>
3<head>
4<title>Calculator Implementation Overview</title>
5<meta charset="UTF-8">
6</head>
7<h1>M Calculator Implementation Overview</h1>
8<p>Although the appearance of the calculator has changed little from Lollipop, and some of the UI
9code is indeed the same, the rest of the code has changed substantially. Unsurprisingly,
10<b>Calculator.java</b> implements the main UI. The other major parts of the implementation
11are:</p>
12
13<p><b>CR.java</b> in <b>external/crcalc</b> provides the underlying demand-driven ("constructive
14real") arithmetic implementation. Numbers are represented primarily as objects with a method that
15can compute arbitrarily precise approximations. The actual arithmetic performed by these methods
16is based on Java's <tt>java.util.BigInteger</tt> arithmetic, with appropriate implicit
17scaling.</p>
18
19<p><b>BoundedRational.java</b> is a rational arithmetic package that is used to provide finite
20exact answers in "easy" cases. It is used primarily to determine when an approximation provided
21by CR.java is actually exact. This is used in turn both to limit the length of displayed results
22and scrolling, as well as to identify errors such as division by zero, that would otherwise result
23in timeouts during computations. It is in some sense not needed to produce correct results, but
24it significantly improves the usability of the calculator. It is also used for the "display as
25fraction" option in the overflow menu.</p>
26
27<p><b>CalculatorExpr.java</b> implements calculator arithmetic expressions. It supports editing,
28saving, restoring, and evaluation of expressions. Evaluation produces a constructive real (CR)
29and possibly a BoundedRational result. Unlike the "arity" library used in earlier versions, the
30underlying expression is represented as a sequence of "tokens", many of which are represented by
31Button ids, not as a character string.</p>
32
33<p><b>Evaluator.java</b> implements much of the actual calculator logic, particularly background
34expression evaluation. Expression evaluation here includes both using CalculatorExpr.java to
35evaluate the expression, and then invoking the resulting CR value to actually produce finite
36approximations and convert them to decimal. Two types of expression evaluation are supported:
37(1) Initial evaluation of the expression and producing an initial decimal approximation, and (2)
38reevaluation to higher precision. (1) is invoked directly from the Calculator UI, while (2) is
39invoked from the calculator display, commonly in response to scrolling. When the display requests
40a result, a "result" is immediately returned, though it may contains blank placeholders. The
41display is then notified when the real result becomes available.</p>
42
43<p><b>CalculatorText.java</b> is the TextView subclass used to display the formula.</p>
44
45<p><b>CalculatorResult.java</b> is the TextView subclass used to display the result. It handles
46result formatting, scrolling, etc. After the user hits "=", the CalculatorResult widget moves
47into the top position, replacing the formula display. Currently it remains in that position until
48the formula is again modified.</p>
49</body>
50</html>
51