【问题标题】:Objective-C - float checking for nanObjective-C - 对 nan 进行浮点检查
【发布时间】:2011-03-29 04:05:47
【问题描述】:

我有一个变量float slope,打印出来时它的值有时会是nan,因为有时会发生除以 0

我正在尝试在发生这种情况时执行 if-else。我怎样才能做到这一点? if (slope == nan) 似乎不起作用。

【问题讨论】:

  • isNan in objective c的可能重复
  • Objective-C 用于浮点或双精度:isnan(slope); floatPointType 的 Swift:slope.isNaN

标签: objective-c floating-point nan


【解决方案1】:

两种方式,或多或少是等价的:

if (slope != slope) {
    // handle nan here
}

或者

#include <math.h>
...
if (isnan(slope)) {
    // handle nan here
}

man isnan 会给你更多信息,或者你可以在 C 标准中阅读所有相关信息)

或者,您可以在进行除法之前检测到分母为零(或者如果您最终要在斜率上使用 atan 而不是进行其他一些计算,则使用 atan2)。

【讨论】:

  • 如果我在某些代码中遇到if (foo != foo),我会发出一个非常可听的“WTF”。 isnan 似乎是一个更清晰易读的方法。
  • @Squeegy:对于熟悉浮点的人来说,他们读的一样。对于不是的人,是的,isnan 更清楚。
  • @AndrewHeinlein:不完全是。它会扩展为x != x,除非您使用-ffast-math 或类似工具进行编译,在这种情况下,它会扩展为对__isnanf__isnand 的调用(因为x != x 在-ffast- 下无法正常工作数学)。所以一般最好使用isnan
  • 但是,__isnanf__isnand 扩展为什么?
  • @IulianOnofrei 因为 NaN 被定义为不等于任何东西,包括 NaN。
【解决方案2】:

没有任何东西等于NaN — 包括NaN 本身。所以检查x != x

【讨论】:

    【解决方案3】:
     if(isnan(slope)) {
    
         yourtextfield.text = @"";
         //so textfield value will be empty string if floatvalue is nan
    }
    else
    {
         yourtextfield.text = [NSString stringWithFormat:@"%.1f",slope];
    }
    

    希望这对你有用。

    【讨论】:

      【解决方案4】:

      在 Swift 中,你需要做 slope.isNaN 来检查它是否是一个 NaN。

      【讨论】:

        猜你喜欢
        • 2012-03-09
        • 2011-07-23
        • 2021-09-28
        • 2010-10-08
        • 2011-06-09
        • 1970-01-01
        • 2011-09-07
        相关资源
        最近更新 更多