mirror of
https://github.com/rn10950/RetroZilla.git
synced 2024-11-14 03:30:17 +01:00
54 lines
2.3 KiB
Plaintext
54 lines
2.3 KiB
Plaintext
This file describes how pi is computed by the program in 'pi.c' (see
|
|
the utils subdirectory).
|
|
|
|
Basically, we use Machin's formula, which is what everyone in the
|
|
world uses as a simple method for computing approximations to pi.
|
|
This works for up to a few thousand digits without too much effort.
|
|
Beyond that, though, it gets too slow.
|
|
|
|
Machin's formula states:
|
|
|
|
pi := 16 * arctan(1/5) - 4 * arctan(1/239)
|
|
|
|
We compute this in integer arithmetic by first multiplying everything
|
|
through by 10^d, where 'd' is the number of digits of pi we wanted to
|
|
compute. It turns out, the last few digits will be wrong, but the
|
|
number that are wrong is usually very small (ordinarly only 2-3).
|
|
Having done this, we compute the arctan() function using the formula:
|
|
|
|
1 1 1 1 1
|
|
arctan(1/x) := --- - ----- + ----- - ----- + ----- - ...
|
|
x 3 x^3 5 x^5 7 x^7 9 x^9
|
|
|
|
This is done iteratively by computing the first term manually, and
|
|
then iteratively dividing x^2 and k, where k = 3, 5, 7, ... out of the
|
|
current figure. This is then added to (or subtracted from) a running
|
|
sum, as appropriate. The iteration continues until we overflow our
|
|
available precision and the current figure goes to zero under integer
|
|
division. At that point, we're finished.
|
|
|
|
Actually, we get a couple extra bits of precision out of the fact that
|
|
we know we're computing y * arctan(1/x), by setting up the multiplier
|
|
as:
|
|
|
|
y * 10^d
|
|
|
|
... instead of just 10^d. There is also a bit of cleverness in how
|
|
the loop is constructed, to avoid special-casing the first term.
|
|
Check out the code for arctan() in 'pi.c', if you are interested in
|
|
seeing how it is set up.
|
|
|
|
Thanks to Jason P. for this algorithm, which I assembled from notes
|
|
and programs found on his cool "Pile of Pi Programs" page, at:
|
|
|
|
http://www.isr.umd.edu/~jasonp/pipage.html
|
|
|
|
Thanks also to Henrik Johansson <Henrik.Johansson@Nexus.Comm.SE>, from
|
|
whose pi program I borrowed the clever idea of pre-multiplying by x in
|
|
order to avoid a special case on the loop iteration.
|
|
|
|
------------------------------------------------------------------
|
|
This Source Code Form is subject to the terms of the Mozilla Public
|
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|