Matlab 版 (精华区)
发信人: hahn (有奇☆闭关造文中), 信区: Matlab
标 题: [合集] 关于mod函数的bug
发信站: 哈工大紫丁香 (Tue Nov 14 07:31:12 2006), 站内
────────────────────────────────────────
zjliu (秋天的萝卜) 于 (Sat Jun 3 12:54:58 2006) 说道:
今天在研学论坛上看到这样一个问题:
mod(3^40,41),结果会等于2048。请问为何?是数的范围超出了,
还是什么原因,用rem也是一样的结果。
by soosen
我是这样回答的:
查不出来原因:
你这样算吧
mod(mod(3^40,41),41)
大家可以研究一下
────────────────────────────────────────
feifeifool (爱芳) 于 (Sat Jun 3 14:31:08 2006) 说道:
这个是从一个人blog找到的:
比较了三个软件在数值运算上的差异。
============================================================================
大学四年即将结束了,总结一下,大学期间最主要的解决问题的三个工具软件是VC,mat
lab和mathematica.以前大二下学期的时候也用过一段TC,但很快就淘汰不用了,所以在
此略去不提。这三种工具真可谓是个有所长,不宜偏废,如若搭配运用得当,自可以一
敌百,事半功倍而威力无穷。先说VC,它最大的好处就是快,它的速度是没得说得,大
型的仿真由于数据量大还是用它比较好,但它的缺点是由于C/C++比较底层,数据类型和
操作都不如其他工具丰富,写大型的东西比较繁琐。但随着各种模版库的建立,完善和
普及,这个缺点被解决得越来越好了。matlab的使用是最方便的,它以简洁的形式提供
极其大量和丰富的内建函数和各种操作,几乎只要是你想到的学过的成熟的方法都已经
被写成现成高效的函数可供调用。正是这些便利使得它提供实时修改,能让用户边做边
想边学,也就是可以实时把你脑子里的想法实现看结果是否正确,这对于一些研究性学
习和工作是很有好处的。matlab还有一个优点就是它的数组等可以开得很大,内存管理
设计得方便易用,在解一些大型搜索和排列组合问题时VC的内存开销往往受限制,需要
用结构体,指针等动态的内存,不够简洁方便,不过VC的速度可以弥补它的繁琐,matl
ab解搜索还是远不如它快的。但是话说回来,matlab虽然方便,但它的符号计算就不完
全是那么简洁,于是mathematica的作用就凸现出来了。它提供与实际数学书写符号完全
一致的数学表达式输入方法,这对于初学者和用到它基础功能的人来说是无比便利的,
因为他们不需要去学那么多的指令。那matlab的符号计算是不是就毫无优势呢,那也不
完全是。在涉及到矩阵的符号运算时matlab由于本身就擅长矩阵运算,它提供的输入和
使用方法是比mathematica要便捷的。而且由于mathematica的函数名大都以大写字母开
头,输入时要频繁切换大小写,不像matlab处处为用户找想,函数名基本都是小写字母
。那这么说来mathematica岂不是没有什么专业上的优势,也只是能给初学者提供便捷的
入门罢了,事情可不是那么简单。我个人认为mathematica最大的优势就在于它的无限精
度计算,这是其他两个工具都望尘莫及的,这种强大的计算能力使得它不仅适合解工程
问题,也适合解“变态”的科学问题。而相比之下,VC的数据来个long double就很不错
了,中间数据的截取等使得它在高精度计算中有效位数难以保证。matlab内核以C写成,
将数据类型和精度作了极大的调整和扩充,使得它表示的数的范围和精度比VC高很多,
但是仍然难以胜任科学计算,主要还是做工程运算。比如说matlab的阶乘函数factoria
l算到25以上就肯定不准了,因为数太大,增长太快。反过来看mathematica,100的阶乘
瞬间就能出结果,而且158位数全部精确显示,让人不得不惊讶它的算法效率和准确度。
记得当时计算一个大数问题需要生成一个50万位的数,只有mathematica能够完全胜任。
还有一次计算素数问题,中间涉及到了阶乘,为了检验自己的VC程序答案是否正确,需
要有比对的参考,结果发现matlab与VC和mathematica的结果不一致,经过仔细的分析比
较发现是matlab的取余函数mod在被除数很大时出现了错误,而mathematica保持了准确
性。VC的结果是我用更简洁的算法得到的结果,不涉及大量计算。根据上面的比较可以
看出上面三种工具都是十分强大的,它们可以互为补充,互相借鉴,如果解决一个问题
需要动用这三种工具,那这个问题也算不凡了。总之,三者合一,珠联璧合,取长补短
,才能发挥出我那台早过时的电脑最大的价值。
============================================================================
【 在 zjliu (秋天的萝卜) 的大作中提到: 】
: 今天在研学论坛上看到这样一个问题:
:
: mod(3^40,41),结果会等于2048。请问为何?是数的范围超出了,
: ...................
────────────────────────────────────────
feifeifool (爱芳) 于 (Sat Jun 3 14:32:22 2006) 说道:
里面提到了matlab中的阶乘、取余函数,并不出色!
其他的东西也不是很清楚了。
【 在 feifeifool (爱芳) 的大作中提到: 】
: 这个是从一个人blog找到的:
: 比较了三个软件在数值运算上的差异。
: ============================================================================
: ...................
────────────────────────────────────────
hahn (gemini&&sar&&gre) 于 (Sat Jun 3 16:50:36 2006) 说道:
尝试用floor先得到n, 然后再求mod
结果还是一样...
如果这个mod调用的是floor
那么问题就在floor
会不会是3^40太大,浮点精度不够,尾数取整导致的
我试着把41换成其他数,都不对
比如mod(3^40,40),结果是0
这显然不对
由此可见,当mod的第一个操作数较大时
matlab的结果都是不可靠的。
mod(3^40,41)是个比较过分的错误
...
【 在 zjliu (秋天的萝卜) 的大作中提到: 】
: 今天在研学论坛上看到这样一个问题:
:
: mod(3^40,41),结果会等于2048。请问为何?是数的范围超出了,
: ...................
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.865毫秒