Objective-C - 对 nan 进行浮点检查

Posted

技术标签:

【中文标题】Objective-C - 对 nan 进行浮点检查【英文标题】:Objective-C - float checking for 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 【参考方案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。

【讨论】:

以上是关于Objective-C - 对 nan 进行浮点检查的主要内容,如果未能解决你的问题,请参考以下文章

对于包含无效值的数据集,我应该使用浮点的 NaN 还是浮点 + bool?

从二进制形式转换浮点 NaN 值,反之亦然导致不匹配

java.lang.NumberFormatException: Infinite or NaN原因之浮点类型除数为0结果探究

使用 IEEE 浮点进行优化 - 保证数学恒等式?

测试浮点 NaN 会导致堆栈溢出

Pandas 替换 NaN 值