<HTML> <HEAD> <TITLE>Constructive Real Calculator and Library Implementation Notes</title> </head> <BODY BGCOLOR="#FFFFFF"> <H1>Constructive Real Calculator and Library Implementation Notes</h1> </body> The calculator is based on the constructive real library consisting mainly of <TT>com.sgi.math.CR</tt> and <TT>com.sgi.math.UnaryCRFunction</tt>. The former provides basic arithmetic operations on constructive reals. The latter provides some basic operations on unary functions over the constructive reals. <H2>General approach</h2> The library was not designed to use the absolute best known algorithms and to provide the best possible performance. To do so would have significantly complicated the code, and lengthened start-up times for the calculator and similar applications. Instead the goals were to: <OL> <LI> Rely on the standard library to the greatest possible extent. The implementation relies heavily on <TT>java.math.BigInteger</tt>, in spite of the fact that it may not provide asymptotically optimal performance for all operations. <LI> Use algorithms with asymptotically reasonable performance. <LI> Keep the code, and especially the library code, simple. This was done both to make it more easily understandable, and to keep down class loading time. <LI> Avoid heuristics. The code accepts that there is no practical way to avoid diverging computations. The user interface is designed to deal with that. There is no attempt to try to prove that a computation will diverge ahead of time, not even in cases in which such a proof is trivial. </ol> A constructive real number <I>x</i> is represented abstractly as a function <I>f<SUB>x</sub></i>, such that <I>f<SUB>x</sub>(n)</i> produces a scaled integer approximation to <I>x</i>, with an error of strictly less than 2<SUP><I>n</i></sup>. More precisely: <P> |<I>f<SUB>x</sub></i>(<I>n</i>) * 2<SUP><I>n</i></sup> - x| < 2<SUP><I>n</i></sup> <P> Since Java does not support higher order functions, these functions are actually represented as objects with an <TT>approximate</tt> function. In order to obtain reasonable performance, each object caches the best previous approximation computed so far. <P> This is very similar to earlier work by Boehm, Lee, Cartwright, Riggle, and O'Donnell. The implementation borrows many ideas from the <A HREF="http://reality.sgi.com/boehm/calc">calculator</a> developed earlier by Boehm and Lee. The major differences are the user interface, the portability of the implementation, the emphasis on simplicity, and the reliance on a general implementation of inverse functions. <P> Several alternate and functionally equivalent representations of constructive real numbers are possible. Gosper and Vuillemin proposed representations based on continued fractions. A representation as functions producing variable precision intervals is probably more efficient for larger scale computation. We chose this representation because it can be implemented compactly layered on large integer arithmetic. <H2>Transcendental functions</h2> The exponential and natural logarithm functions are implemented as Taylor series expansions. There is also a specialized function that computes the Taylor series expansion of atan(1/n), where n is a small integer. This allows moderately efficient computation of pi using <P> pi/4 = 4*atan(1/5) - atan(1/239) <P> All of the remaining trigonometric functions are implemented in terms of the cosine function, which again uses a Taylor series expansion. <P> The inverse trigonometric functions are implemented using a general inverse function operation in <TT>UnaryCRFunction</tt>. This is more expensive than a direct implementation, since each time an approximation to the result is computed, several evaluations of the underlying trigonometric function are needed. Nonetheless, it appears to be surprisingly practical, at least for something as undemanding as a desk calculator. <H2>Prior work</h2> There has been much prior research on the constructive/recursive/computable real numbers and constructive analysis. Relatively little of this has been concerned with issues related to practical implementations. <P> Several implementation efforts examined representations based on either infinite, lazily-evaluated decimal expansions (Schwartz), or continued fractions (Gosper, Vuillemin). So far, these appear less practical than what is implemented here. <P> Probably the most practical approach to constructive real arithmetic is one based on interval arithmetic. A variant that is close to, but not quite, constructive real arithmetic is described in <P> Oliver Aberth, <I>Precise Numerical Analysis</i>, Wm. C. Brown Publishers, Dubuque, Iowa, 1988. <P> The issues related to using this in a higher performance implementation of constructive real arithmetic are explored in <P> Lee and Boehm, "Optimizing Programs over the Constructive Reals", <I>ACM SIGPLAN 90 Conference on Programming Language Design and Implementation, SIGPLAN Notices 25</i>, 6, pp. 102-111. <P> The particular implementation strategy used n this calculator was previously described in <P> Boehm, Cartwright, Riggle, and O'Donnell, "Exact Real Arithmetic: A Case Study in Higher Order Programming", <I>Proceedings of the 1986 ACM Lisp and Functional Programming Conference</i>, pp. 162-173, 1986. </body> </html>

网站相关

常用链接

关于

提供Android系统源代码在线阅读功能,同时我们采集了一些优秀的解读系统的文章并得到作者的援权发布。希望本站能成为您学习Android系统,进行Android开发的良师益友。

Copyright© 2013-2016 All Rights Reserved 京ICP备13033312号