2011-01-07 113 views
1

我有一个简单的递归函数,它使用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

回答

4

由于浮点运算永远不会在浮点运算中精确计算,所以永远不会得到值== 0.00。您可能想尝试一些类似于价值< 0.0000001或类似的东西,并在其工作的地方调整它。

+1

不要说永远。假设IEEE 754,给定的浮点计算是否准确是为所有输入精确定义的。并请不要去推荐随机epsilons代替正确的分析... – 2011-01-07 18:42:51

+1

@R ..只是务实 – 2011-01-07 18:48:55

6

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

我怀疑这是实际发生的事情。您的数据类型可能会达到最小的正值,如1 * 2^(-10000)(10000头来自我的头顶),现在value * 0.98 = value。例如,它必须四舍五入为0total0.98*total明显更接近于total
但这只是猜测,但。使用浮点运算,你永远无法确定:)

2

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

做这样的事情:

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

使用这种(如您似乎要为2位精度

if (value < 0.001) 

你不应该使用浮点值相等

2

(。值== 0.00)

永不成真 或者,它需要如此它运行的函数的任何运行,以及堆栈溢出:P 你应该再看看你是如何完成你的功能的。现在它甚至没有用,它只能返回0.

0

不会比较浮点值和常量,总是检查它们是否落在下限之下。 更改您的价值== 0.00至值< = 0.0001例如

0

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

很显然,我的课中跳过了一点浮点细节...... 因为每个人都差不多说着同样的事情(不会比较浮点和平等,因为他们从来都不是真的)如果我使用了整数或双打,那么这个结果是否为真?

本来我的测试就好像(价值< = 0.0),但这给了我同样的东西。

刚刚与测试运行它为< = 0.005,这似乎很好!

谢谢大家!

mIL3S

www.milkdrinkingcow.com

1

你可以检查if (value * 0.98 == value)而不是if (value == 0)。当value变得非常小(低于正常值),以至于其乘以0.98产生不同结果的精度太少时,该条件将准确满足。