Code: Select all
; Copyright (c) 2008 the authors listed at the following URL, and/or
; the authors of referenced articles or incorporated external code:
; http://en.literateprograms.org/Pi_with_Machin's_formula_(Lisp)?action=history&offset=20060307031705
;
; Permission is hereby granted, free of charge, to any person obtaining
; a copy of this software and associated documentation files (the
; "Software"), to deal in the Software without restriction, including
; without limitation the rights to use, copy, modify, merge, publish,
; distribute, sublicense, and/or sell copies of the Software, and to
; permit persons to whom the Software is furnished to do so, subject to
; the following conditions:
;
; The above copyright notice and this permission notice shall be
; included in all copies or substantial portions of the Software.
;
; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
; IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
; CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
; TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
;
; Retrieved from: http://en.literateprograms.org/Pi_with_Machin's_formula_(Lisp)?oldid=2756
(define (arccot x unity)
(let ((xpower (floor (/ unity x))))
(arccot-plus-helper (* x x) 1 xpower)))
(define (arccot-plus-helper xsq n xpower)
(let ((term (floor (/ xpower n))))
(if (= term 0)
0
(+ (arccot-minus-helper xsq (+ n 2) (floor (/ xpower xsq)))
term))))
(define (arccot-minus-helper xsq n xpower)
(let ((term (floor (/ xpower n))))
(if (= term 0)
0
(- (arccot-plus-helper xsq (+ n 2) (floor (/ xpower xsq)))
term))))
(define (pidigits digits)
(letn (
(unity (pow 10 (+ digits 10)))
(pi (* 4 (- (* 4 (arccot 5 unity)) (arccot 239 unity)))))
(floor (/ pi (pow 10 10)))))
Code: Select all
> (pidigits 6)
3141592
> (pidigits 7)
31415926
> (pidigits 8)
314159265
> (pidigits 9)
-791741031
--hsm