菜鸟教程小白 发表于 2022-12-13 08:58:22

ios - objective-c : Safe float comparison fails strangely


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

<pre><code>//To start the process run this:
;




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

    if ((fabs(f - 1.0f) &lt; FLT_EPSILON)) {
      NSLog(@&#34;STOP&#34;);
    }
    else {
      NSLog(@&#34;F %f&#34;, f);
      ;
    }
}
</code></pre>

<p>而且比较总是会失败,代码会进入无限循环。我已经在 iOS 7 上的 32 位设备和 iOS 8 上的 iPhone 5S 模拟器上对此进行了测试。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>问题是您正在累积不精确的值。 <code>FLT_EPSILON</code> 应定义为 <code>1.0f + FLT_EPSILON != 1.0f</code> 的最小值。</p>

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

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

<pre><code>0.98            1.0-0.02/2            1.0
|               |      ACCEPTABLE   |   ACCEPTABLE...   
</code></pre>

<p>Xcode 5.1 上的 lldb</p>

<pre><code>(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)) &lt; __FLT_EPSILON__
(bool) $3 = false
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios -objective-c: Safe float comparison fails strangely,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/25563407/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/25563407/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - objective-c : Safe float comparison fails strangely