[英]Simple Recursion Help
我有一个简单的递归函数,它使用0.98的height1:height2之比来计算简单的摆摆衰减。
该函数的基本情况为0.0,但是由于某种原因,它变成了无限的自调用!
谁能发现我所缺少的东西?
码:
float swingDecay (float value) {
if ( value == 0.00 ) {
return value;
}
else {
return swingDecay (value * 0.98); }
}
mIL3S www.milkdrinkingcow.com
在浮点计算中,应始终使用“近似”比较。 例如, if (abs(value) < EPS)
而不是if ( value == 0.00 )
。 这里的EPS
是一个小常数(取决于您的要求和数据类型)。
我怀疑这是实际情况。 您将获得数据类型中可能的最小正值,例如1 * 2^(-10000)
(10000来自我的头顶),现在value * 0.98 = value
。 例如,它必须被倒圆要么0
或total
和0.98*total
显然是更接近total
。
但这只是猜测。 使用浮点计算,您将永远无法确定:)
由于浮点计算在浮点数学中从来都不是精确的,因此您永远不会获得值== 0.00。 您可能想尝试类似<<0.0000001的值或类似的东西,并在可行的地方对其进行调整。
不要直接比较浮点数; 您的“值”可能永远不会真正为0.0(零)。
做类似的事情:
float smallNumber = 0.00001;
if ( value < smallNumber )
{
...
}
(值== 0.00)
永远不会成真。 或者,它需要运行大量函数,然后它就会运行到堆栈溢出中:P您应该再看一下如何编写函数。 现在,它甚至没有用,只能返回0。
您可以检查if (value * 0.98 == value)
而不是if (value == 0)
。 当value
变得太小(低于正常值)以至于精度乘以0.98
位数太少而不能产生不同的结果时,将完全满足此条件。
使用此功能(似乎您希望获得2位数的精度。
if (value < 0.001 )
您不应该对浮点值使用相等性。
不要将浮点值与常量进行比较,请始终检查它们是否在下限以下。 例如,将您的值== 0.00更改为值<= 0.0001
哇,谢谢大家的快速回答!
显然,我的课堂上忽略了很少的浮点细节...因此,由于每个人都在说同一件事(不要将浮点数与相等值进行比较,因为它们从未真正精确地比较过),所以如果我使用整数还是双倍?
最初,我进行的测试就好像(value <= 0.0),但这给了我同样的事情。
只需在<= 0.005的条件下运行它就可以了!
谢谢大家!
mIL3S
www.milkdrinkingcow.com
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.