查看文章 |
大数的奥妙
2008-08-24 02:13
当我历尽千辛万苦终于推导出一串看起来极其复杂的公式,喜不自胜,手舞足蹈,然后急不可耐的输入到Matlab中,试图获得一个能够展现某种规律的结果;很不幸的,一向视为左膀右臂的Matlab哼哼唧唧运转半天之后,无情的给出了不亚于晴天霹雳的所谓“Inf”的答案。Inf?!没有除0这种愚蠢的操作啊,为什么会Inf?这里面隐藏了什么样的陷阱? 是的,有陷阱。有一个数字N=8000000,并不太起眼。只是当我毫无戒心的输入N!、N^N等之类的算式时,陷阱就埋下了,它们偷偷的把“Inf”一直传递到了最终的结果中。八百万的阶乘啊,这是多大?多少个亿? 中国古代《五经算术》有载:“按黄帝为法,数有十等。及其用也,乃有三焉。十等者,谓「亿、兆、京、垓、秭、穰、沟、涧、正、载」也。”后自天竺佛经中引入“极、恒河沙、阿僧祇、那由他、不可思议、无量大数”。以万为进,则无量大数表示10的68次方。现代记法已不同,为与国际接轨,大数都以千为进,从千开始,依次是:千、兆、吉、太、拍、艾、泽、尧。只是兆的用法常遭诟病,从古代的10的12次方变成了现代的10的6次方,历史原因造成,不追述。台湾人就沿袭古制,所以在台湾人的书中看到兆,就记得不要混淆成百万了。 回头来研究一下阶乘。Matlab可以算到多少的阶乘呢?170的阶乘约7.2574e+306,再往上就只能得到Inf了。看到这个数就不难想出原因所在:双精度浮点数据类型可表示的最大十进制数为1.7976931348623158e+308。要想表示更大的数并且进行运算,就必须另外设计数据存储结构及其运算法则。噢,多么令人头疼的事情! 好在有Google。万分欣喜的在Google上发现,已经有非常多的人在大数运算上做过贡献,而且至今都还有人在探讨更加高效的算法。大数运算实现的基本思路就是采用数组或者链表来按位存储,然后采用类似珠算的方法按位计算。目前应用最广泛、最成熟的大数运算库应该是GMP(GNU multiple precision functions),可以做任意精度的四则运算。Down下来琢磨琢磨,先编了小程序计算100000阶乘的精确值,算得倒是不慢,可是打印结果......当我闲逛约5分钟后回来,发现屏幕上仍然如黑客帝国般进行着数字翻滚,遂迅速关闭之。 上网时搜到Google公司与大数的一则轶闻。Google是英文单词“Googol”按照通常的英语拼法改写而来的。Googol是一个大数的名称,表示10的100次方。Google公司采用这个词是想显示公司征服网上无穷无尽资料的雄心。最终没有采用Googol可能是因为版权的问题,而且当他们注册Google.com的时候,Googol.com已经被注册。 记于此,以证我曾奋斗于大数的历史。 |
最近读者: