繁体   English   中英

简单递归帮助

[英]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 例如,它必须被倒圆要么0total0.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM