免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 星条旗
打印 上一主题 下一主题

[学习共享] 来写几段天书式的dc程序 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2012-12-03 09:37 |只看该作者
用Ramanujan算法快速逼近圆周率真实值
程序接受输入:圆周率精度   迭代次数
  1. dc -e '?s$k 1 [ s~ l~ 4* [q]s.[d1=.d1-l_x*]ds_x 1103 26390 l~ * + * l~ [q]s![d1=!d1-l|x*]ds|x 4^ 396 4 l~ * ^ * / l~1+ dl$><]s<l<xs# z [s@ + l@ 1- d1<<]s<l<xs# 1103+ 8v * 9801 / 1 r / f'

  2. 1000 150

  3. 3.1415926535897932384626433832795028841971693993751058209749445923078\
  4. 164062862089986280348253421170679821480865132823066470938446095505822\
  5. 317253594081284811174502841027019385211055596446229489549303819644288\
  6. 109756659334461284756482337867831652712019091456485669234603486104543\
  7. 266482133936072602491412737245870066063155881748815209209628292540917\
  8. 153643678925903600113305305488204665213841469519415116094330572703657\
  9. 595919530921861173819326117931051185480744623799627495673518857527248\
  10. 912279381830119491298336733624406566430860213949463952247371907021798\
  11. 609437027705392171762931767523846748184676694051320005681271452635608\
  12. 277857713427577896091736371787214684409012249534301465495853710507922\
  13. 796892589235420199561121290219608640344181598136297747713099605187072\
  14. 113499999983729780499510597317328160963185950244594553469083026425223\
  15. 082533446850352619311881710100031378387528865875332083814206171776691\
  16. 473035982534904287554687311595628638823537875937519577818577805321712\
  17. 268066130019278766111959092164201997
复制代码
与bc运算结果之差小于10^-998.
  1. echo "scale=1000;4*a(1)"|bc -l
复制代码

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
22 [报告]
发表于 2012-12-03 09:38 |只看该作者
NB,不得不学习!!

论坛徽章:
0
23 [报告]
发表于 2012-12-03 17:45 |只看该作者
回复 22# blackold

过奖了!

下面贴个老外的dc作品,是计算汉诺塔的。
运行方法:dc -e n hanoi.dc
  1. #
  2. # The Towers Of Hanoi
  3. # dc (Unix Desk Calculator) version
  4. # Copyright (C) 2003 Amit Singh. All Rights Reserved.
  5. # http://hanoi.kernelthread.com
  6. #
  7. # Tested under GNU dc 1.3
  8. #

  9. # Usage: dc -e n hanoi.dc
  10. #        where n is the number of disks

  11. [ # move(from, to)
  12.     n           # print from
  13.     [ --> ]n    # print " --> "
  14.     p           # print to\n
  15.     sw          # p doesn't pop, so get rid of the value
  16. ]sm

  17. [ # init(n)
  18.     sw          # tuck n away temporarily
  19.     9           # sentinel as bottom of stack
  20.     lw          # bring n back
  21.     1           # "from" tower's label
  22.     3           # "to" tower's label
  23.     0           # processed marker
  24. ]si

  25. [ # Move()
  26.     lt          # push to
  27.     lf          # push from
  28.     lmx         # call move(from, to)
  29. ]sM

  30. [ # code block <d>
  31.     ln          # push n
  32.     lf          # push from
  33.     lt          # push to
  34.     1           # push processed marker 1
  35.     ln          # push n
  36.     1           # push 1
  37.     -           # n - 1
  38.     lf          # push from
  39.     ll          # push left
  40.     0           # push processed marker 0
  41. ]sd

  42. [ # code block <e>
  43.     ln          # push n
  44.     1           # push 1
  45.     -           # n - 1
  46.     ll          # push left
  47.     lt          # push to
  48.     0           # push processed marker 0
  49. ]se

  50. [ # code block <x>
  51.     ln 1 =M
  52.     ln 1 !=d
  53. ]sx

  54. [ # code block <y>
  55.     lMx
  56.     lex
  57. ]sy

  58. [ # quit()
  59.     q           # exit the program
  60. ]sq

  61. [ # run()
  62.     d 9 =q      # if stack empty, quit()
  63.     sp          # processed
  64.     st          # to
  65.     sf          # from
  66.     sn          # n
  67.     6           #
  68.     lf          #
  69.     -           #
  70.     lt          #
  71.     -           # 6 - from - to
  72.     sl          #
  73.     lp 0 =x     #
  74.     lp 0 !=y    #
  75.     lrx         # loop
  76. ]sr

  77. lix # init(n)
  78. lrx # run()
复制代码

论坛徽章:
0
24 [报告]
发表于 2012-12-03 17:49 |只看该作者
dc or bc ?

那么到底用dc还是bc呢:)

先考察一下各自的性能

计算大数的乘方


  1. time dc -e '2 88888 ^ p'

  2. real 0m0.241s
  3. user 0m0.216s
  4. sys 0m0.008s



  5. time echo "2^88888" |bc

  6. real 0m0.240s
  7. user 0m0.216s
  8. sys 0m0.004s
复制代码
计算小数点后一千位圆周率的值

  1. time dc -e '1000k 150 s$ 1 [ s~ l~ 4* [q]s.[d1=.d1-l_x*]ds_x 1103 26390 l~ * + * l~ [q]s![d1=!d1-l|x*]ds|x 4^ 396 4 l~ * ^ * / l~1+ dl$><]s<l<xs# z [s@ + l@ 1- d1<<]s<l<xs# 1103+ 8v * 9801 / 1 r / f'

  2. real 0m0.710s
  3. user 0m0.704s
  4. sys 0m0.000s



  5. time echo "scale=1000;4*a(1)"|bc -l

  6. real 0m0.600s
  7. user 0m0.596s
  8. sys 0m0.000s
复制代码
计算10000的乘阶

  1. time echo "
  2. define f (x) {
  3. if (x <= 1) return (1);
  4. return (f(x-1) * x);
  5. }
  6. f(10000)
  7. " | bc

  8. real 0m2.270s
  9. user 0m2.236s
  10. sys 0m0.008s

  11. time dc -e '10000[d1-d1<r*]dsrxp'

  12. real 0m2.272s
  13. user 0m2.232s
  14. sys 0m0.004s

复制代码
就上面三个测试结果来看,dc和bc是平分秋色的,额就没有进行其他的测试了。

但是在程序的易写性和易读性来说bc等工具远胜于dc ,这也就是为什么shell

论坛中基本上没有人喜欢讨论这个古老的unix命令的原因。

看来user friendly终究才是趋势,晦涩难懂的语法结构是dc和汇编等低级语言谈出

人们视线的根本原因。

全文完^_*

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
25 [报告]
发表于 2012-12-04 13:41 |只看该作者
我考虑给这帖子加精。 非常不错, 谢谢共享。

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
26 [报告]
发表于 2012-12-04 14:00 |只看该作者
星条旗 发表于 2012-12-03 17:49
dc or bc ?

那么到底用dc还是bc呢:)


曾经:bc只是个dc编译器
现代:很多dc使用bc的库来实现

所以dc~=bc?

论坛徽章:
0
27 [报告]
发表于 2012-12-04 17:31 |只看该作者
waker 发表于 2012-12-04 14:00
曾经:bc只是个dc编译器
现代:很多dc使用bc的库来实现


我进行过很多测试,应该说从运行速度上来看dc和bc的性能是完全一样的。
所以我觉得虽然从代码层面dc和bc风格迥异但是,在编译过后所生成的
低级机械语言层面他们的性能是完全一样的。只不过dc的语言显得更加接近
低级语言而已。
其实仔细想想的话dc对语言这种原始的处理方式在uinx命令家族里面并不孤单。
sed对脚本的处理也有类似的地方,都是在模仿cpu处理数据的方式。
dc脚本是对主栈和寄存器进行操作。
sed是对pattern space和hold space进行操作。
cpu是对存储器和寄存器进行操作。
我觉得cpu对数据处理的模型结构,很大程度上影响了以前那些老unix程序员
的思维,这可能也就是为什么他们把dc弄的这么复杂的原因吧^_^




论坛徽章:
0
28 [报告]
发表于 2012-12-04 18:51 |只看该作者
waker 发表于 2012-12-04 14:00
曾经:bc只是个dc编译器


{:3_182:} 真的假的 ....

论坛徽章:
0
29 [报告]
发表于 2012-12-04 18:52 |只看该作者
星条旗 发表于 2012-12-03 17:45
下面贴个老外的dc作品,是计算汉诺塔的。
运行方法:dc -e n hanoi.dc

求出处








论坛徽章:
0
30 [报告]
发表于 2012-12-04 21:05 |只看该作者
回复 29# hbmhalley

http://www.kernelthread.com/projects/hanoi/
程序来自于一个美国geek,他用各式各样的语言和方法编写了hanoi 包括dc ,sendmail ,tex ,sed ,postscript等
甚至还有世嘉机Dreamcast版本。
你在网页下面的列表里面就可以找到dc 。

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP