【问题标题】:Simple Recursion Help简单递归帮助
【发布时间】:2011-01-07 18:28:56
【问题描述】:

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

【问题讨论】:

    标签: c algorithm recursion game-physics


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      由于浮点计算在浮点数学中永远不会精确,因此您永远不会得到值 == 0.00。您可能想尝试像 value

      【讨论】:

      • 不要说永远。假设 IEEE 754,给定的浮点计算是否精确是针对所有输入精确定义的。并且请不要到处推荐随机的 epsilon 来代替正确的分析...
      【解决方案3】:

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

      做一些类似的事情:

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

      【讨论】:

        【解决方案4】:

        (值 == 0.00)

        永远不会成真。 或者,它需要运行如此多的函数才能运行,好吧,堆栈溢出:P 你应该再看看你是如何制作你的函数的。现在它甚至没有用,它只能返回 0。

        【讨论】:

          【解决方案5】:

          您可以检查if (value * 0.98 == value) 而不是if (value == 0)。当value 变得如此之小(低于正常值)以至于它的精度位太少而无法乘以0.98 以产生不同的结果时,就会恰好满足此条件。

          【讨论】:

            【解决方案6】:

            使用这个(好像你要获得 2 位精度。

            if (value < 0.001 )
            

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

            【讨论】:

              【解决方案7】:

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

              【讨论】:

                【解决方案8】:

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

                显然,我的课上跳过了一点浮点细节...... 因此,既然每个人都在说同样的话(不要将浮点数与相等性进行比较,因为它们从来都不是真正精确的),如果我使用整数或双精度数,同样适用吗?

                最初我的测试好像是 ( value

                只是在

                谢谢大家!

                mIL3S

                www.milkdrinkingcow.com

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-06-21
                  • 2011-02-02
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-12-09
                  • 1970-01-01
                  相关资源
                  最近更新 更多