明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4047|回复: 7

[【高飞鸟】] 【飞鸟集】圆周率小数后800位!(更新到2011.11.1)

[复制链接]
发表于 2008-4-20 01:12:00 | 显示全部楼层 |阅读模式
下面给出一个程序,纯lisp的,能把圆周率精确到小数后800位。稍加修改就可以到10000位,当然远没有C语言快。
不过程序运行命令 test,估计10秒中左右就能把这个数打印出来。

  1. ;;;highflybird    2008.4.20 Haikou
  2. (defun c:test (/ a c p t1 t2 time)
  3.   (setq a 10000 c 2800)
  4.   (setq t1 (getvar "TDUSRTIMER"))
  5.   (setq p  (CalPi a c))
  6.   (setq t2 (getvar "TDUSRTIMER"))
  7.   (setq time (* 86400 (- t2 t1)))
  8.   (setq p (strcat "3." (substr p 2)))
  9.   (princ p)
  10.   (princ "\n共耗时<秒>:")
  11.   (princ time)
  12.   (princ)
  13. )
  14. ;;;计算函数
  15. (defun CalPi (a c / b d e f g h p s x)
  16.   (setq b 0 e 0 P "")
  17.   (setq h (/ a 5))
  18.   (repeat (1+ c)
  19.     (setq f (cons h f))
  20.   )
  21.   (while (> c 0)
  22.     (setq d 0)
  23.     (setq g (+ c c))
  24.     (setq b c)
  25.     (setq x nil)
  26.     (while (> b 0)
  27.       (setq d (* d b))
  28.       (setq b (1- b))
  29.       (setq d (+ d (* (car f) a)))
  30.       (setq f (cdr f))
  31.       (setq g (1- g))
  32.       (setq x (cons (rem d g) x))
  33.       (setq d (/ d g))
  34.       (setq g (1- g))
  35.     )
  36.     (setq f (reverse x))
  37.     (repeat 14
  38.       (setq f (cdr f))
  39.     )
  40.     (setq s (+ e (/ d a)))
  41.     (setq s (itoa s))
  42.     (while (< (strlen s) 4)
  43.       (setq s (strcat "0" s))
  44.     )
  45.     (setq P (strcat p s))
  46.     (setq e (rem d a))
  47.     (setq c (- c 14))
  48.   )
  49.   p
  50. )  
  51. ;;;以后给出完全注释版的
今天重新优化了这个程序,使得速度提高了不少,而且编译成vlx文件,速度更是大步提升。
你若对此有趣,不妨对编译前后做一下比较。
在我的机器上,运行它不到0.5秒。
lisp文件:

vlx文件:


2011.11.1 -----更新在8楼

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 1明经币 +10 收起 理由
ZZXXQQ + 10 【好评】 好贴

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

 楼主| 发表于 2011-11-1 21:04:39 | 显示全部楼层

bn

本帖最后由 highflybir 于 2011-11-1 22:34 编辑

原理介绍参见这篇帖子:http://blog.csdn.net/zyl910/article/details/1368387

详细注视的lisp文件在这里:
部分源代码:
  1. ;;;高精度计算Pi函数
  2. (defun CalPi (digits n / b c d e f g h r s x)
  3.   (setq c (/ (1+ n) (/ (log 2) (log 10))))      ;需要迭代的次数
  4.   (setq c (fix c))                          ;转化为整数
  5.   (setq  e 0 r nil)                                 ;存储结果的字符串赋空值
  6.   (setq h (/ digits 5))                           ;从小数后算起
  7.   (repeat c                                    
  8.     (setq f (cons h f))                           ;初始余数为10000 * 2 / 10
  9.   )
  10.   (repeat (1+ (/ n 4))                            ;重复1+ 800/4 = 201次
  11.     (setq d 0)                                    ;每次末位小数为0
  12.     (setq g (+ c c))                              ;分母。因为每次循环都输出了4位,所以在后面运算时乘以了a,所以这里得 -2
  13.     (setq b c)            ;分子
  14.     (setq x nil)
  15.     (while (> b 0)
  16.       ;;根据公式,乘以分子
  17.       (setq d (* d b))         
  18.       (setq b (1- b))
  19.       (setq d (+ d (* (car f) digits)))      ;因为每次外循环都输出了4位
  20.       ;;根据公式,除以分母
  21.       (setq f (cdr f))
  22.       (setq g (1- g))
  23.       (setq x (cons (rem d g) x))      ;带分数的 分子部分
  24.       (setq d (/ d g))          ;带分数的 整数部分
  25.       (setq g (1- g))
  26.     )
  27.     (setq f (reverse x))
  28.     (repeat 13            
  29.       (setq f (cdr f))
  30.     )
  31.     (setq s (+ e (/ d digits)))        ;printf("%.4d", e+d/a);
  32.     (setq r (cons s r))          ;算出的每一项,注意表的每项如果不足4位要加零补全
  33.     (setq e (rem d digits))        ;e = d % a;
  34.     (setq c (- c 13))          ;因为精度固定为800位,每输出4位后,相当于精度需求降低了4位,所以每次可以少算13项
  35.   )
  36.   (reverse r)            ;把表项反转
  37. )  


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

点评

赞一个  发表于 2011-11-2 05:53
回复 支持 1 反对 0

使用道具 举报

发表于 2008-4-20 10:03:00 | 显示全部楼层
山巅一寺一壶酒……
发表于 2008-4-20 10:10:00 | 显示全部楼层
死机啦。。。呵呵,机子配置不好,
发表于 2008-4-20 11:07:00 | 显示全部楼层

支持,

同时期待完全注释版,呵呵。

发表于 2008-4-21 08:25:00 | 显示全部楼层

我只用了1.28秒

发表于 2008-4-21 16:37:00 | 显示全部楼层
本帖最后由 作者 于 2008-4-21 16:44:37 编辑

很强悍,算法还没有看明白。

http://wg853785.gjjblog.com/archives/748463/

发表于 2011-5-17 12:24:40 | 显示全部楼层
还算比较快的  不用一秒时间
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-26 15:34 , Processed in 0.205400 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表