本帖最后由 highflybir 于 2011-11-1 22:30 编辑
- ;;;高精度计算Pi函数
- (defun CalPi (digits n / b c d e f g h r s x)
- (setq c (/ (1+ n) (/ (log 2) (log 10)))) ;需要迭代的次数
- (setq c (fix c)) ;转化为整数
- (setq e 0 r nil) ;存储结果的字符串赋空值
- (setq h (/ digits 5)) ;从小数后算起
- (repeat c
- (setq f (cons h f)) ;初始余数为10000 * 2 / 10
- )
- (repeat (1+ (/ n 4)) ;重复1+ 800/4 = 201次
- (setq d 0) ;每次末位小数为0
- (setq g (+ c c)) ;分母。因为每次循环都输出了4位,所以在后面运算时乘以了a,所以这里得 -2
- (setq b c) ;分子
- (setq x nil)
- (while (> b 0)
- ;;根据公式,乘以分子
- (setq d (* d b))
- (setq b (1- b))
- (setq d (+ d (* (car f) digits))) ;因为每次外循环都输出了4位
- ;;根据公式,除以分母
- (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 13
- (setq f (cdr f))
- )
- (setq s (+ e (/ d digits))) ;printf("%.4d", e+d/a);
- (setq r (cons s r)) ;算出的每一项,注意表的每项如果不足4位要加零补全
- (setq e (rem d digits)) ;e = d % a;
- (setq c (- c 13)) ;因为精度固定为800位,每输出4位后,相当于精度需求降低了4位,所以每次可以少算13项
- )
- (reverse r) ;把表项反转
- )
测试部分代码见附件:
|