简单的递归帮助

时间:2011-01-07 18:28:56

标签: c algorithm recursion game-physics

我有一个简单的递归函数,使用height1:height2的比率0.98来计算一个简单的摆摆动衰减。

该函数的基本情况为0.0,但由于某种原因,它会变成无限的自我调用!

有人能发现我失踪的东西吗?

代码:

float swingDecay (float value) {


     if ( value == 0.00 ) {
          return value;
     }

     else { 
          return swingDecay (value * 0.98);  }     
}

mIL3S www.milkdrinkingcow.com

8 个答案:

答案 0 :(得分:6)

您应该始终在浮点计算中使用“近似”比较。例如,if (abs(value) < EPS)而不是if ( value == 0.00 )EPS这里是一个小常量(取决于您的要求和数据类型)。

我怀疑这是实际发生的事情。您可以获得数据类型中可能的最小正值,例如1 * 2^(-10000)(10000来自我的头脑)和现在value * 0.98 = value。例如,它必须四舍五入到0total,而0.98*total显然更接近total
但这只是猜测。使用浮点计算,您永远无法确定:)

答案 1 :(得分:4)

由于浮点计算在浮点数学计算中从不精确,因此您永远不会得到值== 0.00。您可能想要尝试类似值&lt; 0.0000001或类似的东西,并调整它的工作地点。

答案 2 :(得分:2)

不要直接比较浮点数;你的“价值”可能永远不会是0.0(零)。

做类似的事情:

float smallNumber = 0.00001;
if ( value < smallNumber )
{
...
}

答案 3 :(得分:2)

(值== 0.00)

永远不会成真。 或者,它需要运行的函数运行很多,堆栈溢出:P 你应该再看一下你的功能。现在它甚至没有用,它只能返回0。

答案 4 :(得分:1)

您可以检查if (value * 0.98 == value)而不是if (value == 0)。当value变得如此之小(低于正常)以至于它具有太少的精度以便乘以0.98以产生不同的结果时,将完全满足该条件。

答案 5 :(得分:0)

使用它(看起来你的准确度是2位数。

if (value < 0.001 )

您不应该对浮点值使用相等。

答案 6 :(得分:0)

不要将浮点值与常量进行比较,请始终检查它们是否属于下限。 将您的值== 0.00更改为值&lt; = 0.0001,例如

答案 7 :(得分:0)

哇,谢谢大家的快速回答!

显然我班上跳过了小浮点细节...... 所以,因为每个人都在说同样的事情(不要将浮点数与平等进行比较,因为它们从来都不是那么精确),如果我使用了int或double,那么同样的情况也适用吗?

最初我的测试好像(值&lt; = 0.0),但这给了我同样的东西。

用测试运行它&lt; = 0.005,这似乎很好!

全部谢谢!

mIL3S

www.milkdrinkingcow.com