saber000
发表于 2014-5-9 21:12:00
我觉得最大的问题在于没有处理x为负数的情况和使用==来判断,一旦x因前面的运算产生误差的话导致有小数部分,那么这个函数就会掉入悲剧的薛定谔死循环.
Leo
发表于 2014-5-10 11:43:00
回复 11楼saber000的帖子
这个和运算误差还没有啥关系,做为double参数,如果我传入的数字是1.5,直接就不是因为运算误差,从-0.5开始掉入无限的深渊。
Leo
发表于 2014-5-10 11:48:00
回复 7楼lihaitao的帖子
不严重,我觉得放在这里大家学习一下,这里有几件事情比较重要,做为程序员的好习惯,少出问题:
1. 传入参数要做必要的判断。如果你的算法本身要假设接下来的运算是整数,那么你一定要对小数情况做出判断之后才决定是否进入你的算法。
2. 浮点数永远不要判等
Leo
发表于 2014-5-10 11:50:00
回复 10楼saber000的帖子
如果这位同学没有判==0,而是判断了>=0,那么就会在N足够大的时候引发堆栈溢出。系统栈貌似给了64K?记不清了,哪位同学有兴趣可以去查一下。当堆栈里面压入的函数返回地址和参数足够大的时候,系统就发生堆栈溢出。
Leo
发表于 2014-5-10 11:52:00
回复 9楼我勒个去的帖子
你和G同学一组的?其实我发现不止一组同学这么写的。我只是随手找了一个典型的。
其实这是很多初写程序的人容易犯的错误,拿出来大家共同学习一下。
saber000
发表于 2014-5-10 14:11:00
回复 12楼Leo的帖子
我的意思是,这个递归200层应该都是小case,但是对于double来说200!早溢出了.
Jered
发表于 2014-5-10 16:36:00
放一些牛逼的代码来膜拜一下啊
Leo
发表于 2014-5-10 22:50:00
牛X的代码是个系统工程,要不等颁奖的时候让作者亲自Show一下的好。其实多从不好的代码中学习,写着写着就牛X了。
paulpei
发表于 2014-5-12 17:16:00
建议看下BigInteger的源码,能给大家很多启迪。
or BigDecimal
xiaobai
发表于 2014-5-13 12:19:00
回复 6楼Leo的帖子
就是的,痛的领悟啊,刚测试完,最大的问题就是这个堆栈溢出,。。。