找回密码
 注册
Simdroid-非首页
查看: 106|回复: 0

[MathCAD] MC计算超大数的方法

[复制链接]
发表于 2013-3-2 00:34:12 | 显示全部楼层 |阅读模式 来自 北京房山
本帖最后由 朱老剑客 于 2013-3-2 08:53 编辑

  在“做Project Euler时偶然发现的”一文中,我不管是直接运行还是使用trunc函数都不能得到2^1000的精确数字,也就是说在处理这种超大数的时候,以MC的计算精度(即使使用符号运算)貌似根本不能实现精确的计算。但是,事情并不能就这么算了,这多少让我感到不舒坦,所以……我找到了一个MC计算超大数的方法,这个在“帮助文件”里可没有哈。
  倒是不难做到,如果我们仅仅是要一个超大数的话——使用float符号运算。
  MC的符号计算的float精度最大250位,而2^1000有302位。不过可以使用trunc函数往下砍超长的部分,然后还是使用float,250。比如:
  ((2^1000)/(10^200)-trunc((2^1000)/(10^200))float,200->
  这样可以显示2^1000的最后200位精确数字。
  ((2^1000)/(10^301))float,250->
  这个可以显示2^1000的最初250位精确数字。
  我用Maple的结果和这个比较,没问题,完全一样。
  图片太长,我就不贴图了。
  然后计算2^10000、2^100000、2^1000000,都没问题,和Maple的计算精度是一样的。
  然后计算2^10000000,完了,不管是MathCAD还是Maple都不能计算了。
  当然MathCAD处理超大数还是有局限性的,需要配合trunc函数,而且要把特别长的数字分成差不多250位一段250位一段的来处理,而且都需要在float符号运算的条件下才能够实现,总之,是很有局限的。但应付Project Euler的将超大数各个位数相加的总和这样的题目,应该没有问题了,做起来麻烦一些,需要分段之后,拷贝出部分段落(比如说10位数字)来定义成新的数字,再计算总和。但肯定能做了哈。
  使用这种trunc分段的方法也可以让MuPAD计算到2^1000000,到2^10000000(1千万次方)也不成了。使用这种trunc分段的方法在Maple里最大能操作2^100000000(1亿次方),再大也不成了,报堆栈溢出。MP的结果和MC的结果相同。而在Maxima中使用这种方法计算超大数,lisp语言层就直接把maxima关掉了,并提示说“restart maxima”。
  嗯,终归用的计算内核都差不多么。只是MathCAD实现起来太麻烦,说来它也不是为了干这个设计的么。


以下是我在前些天MathCAD吧的一段回复,作为“我不管是直接运行还是使用trunc函数都不能得到2^1000的精确数字”的补充说明:

反正第16题和第20题,MathCAD肯定是做不了。
我试着用trunc函数把302位的2^1000修改为10位一段10位一段的,然后for循环30次+2,这么处理最后10位数字没问题,处理最初10位数字没问题,但从第11位到~第20位的时候就不对了。
处理最后10位数:
((2^1000)/(10^10)-trunc((2^1000/10^10)))*10^10
处理最初10位数:
trunc((2^1000)/(10^292))
处理从第11位到第20位数:
trunc(((2^1000)/(10^292)-trunc((2^1000)/(10^292)))*10^10)

评分

1

查看全部评分

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

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-4-28 00:58 , Processed in 0.026616 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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