下面给出一个程序,纯lisp的,能把圆周率精确到小数后800位。稍加修改就可以到10000位,当然远没有C语言快。
不过程序运行命令 test,估计10秒中左右就能把这个数打印出来。
- ;;;highflybird 2008.4.20 Haikou
- (defun c:test (/ a c p t1 t2 time)
- (setq a 10000 c 2800)
- (setq t1 (getvar "TDUSRTIMER"))
- (setq p (CalPi a c))
- (setq t2 (getvar "TDUSRTIMER"))
- (setq time (* 86400 (- t2 t1)))
- (setq p (strcat "3." (substr p 2)))
- (princ p)
- (princ "\n共耗时<秒>:")
- (princ time)
- (princ)
- )
- ;;;计算函数
- (defun CalPi (a c / b d e f g h p s x)
- (setq b 0 e 0 P "")
- (setq h (/ a 5))
- (repeat (1+ c)
- (setq f (cons h f))
- )
- (while (> c 0)
- (setq d 0)
- (setq g (+ c c))
- (setq b c)
- (setq x nil)
- (while (> b 0)
- (setq d (* d b))
- (setq b (1- b))
- (setq d (+ d (* (car f) a)))
- (setq f (cdr f))
- (setq g (1- g))
- (setq x (cons (rem d g) x))
- (setq d (/ d g))
- (setq g (1- g))
- )
- (setq f (reverse x))
- (repeat 14
- (setq f (cdr f))
- )
- (setq s (+ e (/ d a)))
- (setq s (itoa s))
- (while (< (strlen s) 4)
- (setq s (strcat "0" s))
- )
- (setq P (strcat p s))
- (setq e (rem d a))
- (setq c (- c 14))
- )
- p
- )
- ;;;以后给出完全注释版的
今天重新优化了这个程序,使得速度提高了不少,而且编译成vlx文件,速度更是大步提升。
你若对此有趣,不妨对编译前后做一下比较。
在我的机器上,运行它不到0.5秒。
lisp文件:
vlx文件:
2011.11.1 -----更新在8楼
|