gpt4 book ai didi

ios - Objective-C : Safe float comparison fails strangely

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:42:28 24 4
gpt4 key购买 nike

我写了一段代码,遇到了一个非常奇怪的问题。即使实际比较为真,两个 float 之间的比较也会返回 NO。我什至通过与 FLT_EPSILON 进行比较来使用安全浮点比较。这是代码:

//To start the process run this:
[self increment:0.0f];




- (void)increment:(float)f {
f += 0.02f;

if ((fabs(f - 1.0f) < FLT_EPSILON)) {
NSLog(@"STOP");
}
else {
NSLog(@"F %f", f);
[self increment:f];
}
}

并且比较总是会失败并且代码会进入死循环。我已经在 iOS 7 的 32 位设备和 iOS 8 的 iPhone 5S 模拟器上对此进行了测试。

最佳答案

问题是您正在累积不精确的值。 FLT_EPSILON 应定义为满足 1.0f + FLT_EPSILON != 1.0f 的最小值。

发生的情况是,在每一步中,您都将一个有限精度值与另一个有限精度值相加,并累积了一个小误差。由于您正在检查一个足够接近 1.0f 的值以与 1.0f 无法区分,因此检查总是失败。

如果您需要在 1.0 处停止,您应该直接检查 if (f > 1.0f),或者使用更宽松的约束。请注意,如果值比所需值早一点,使用 f > 1.0f 可能会产生额外的迭代,因此如果迭代量必须精确,则它可能不合适。像 f > 1.0 - 0.02f/2 这样的东西应该更精确。

0.98            1.0-0.02/2              1.0
| | ACCEPTABLE | ACCEPTABLE...

Xcode 5.1 上的 lldb

(lldb) p f
(float) $0 = 0.999999582
(lldb) p -(f - 1.0f)
(float) $1 = 0.000000417232513
(lldb) p __FLT_EPSILON__
(float) $2 = 0.00000011920929
(lldb) p (-(f - 1.0)) < __FLT_EPSILON__
(bool) $3 = false

关于ios - Objective-C : Safe float comparison fails strangely,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25563407/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com