我有一个简单的递归函数,使用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
答案 0 :(得分:6)
您应该始终在浮点计算中使用“近似”比较。例如,if (abs(value) < EPS)
而不是if ( value == 0.00 )
。 EPS
这里是一个小常量(取决于您的要求和数据类型)。
我怀疑这是实际发生的事情。您可以获得数据类型中可能的最小正值,例如1 * 2^(-10000)
(10000来自我的头脑)和现在value * 0.98 = value
。例如,它必须四舍五入到0
或total
,而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