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


78

我有一个变量(float slope),在打印出来时有时会具有nan的值,因为有时会发生被0除的情况。

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



1
目标C浮法或双:isnan(slope); 斯威夫特floatingPointType:slope.isNaN
心教堂

Answers:


206

两种方式,或多或少等效:

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

要么

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

man isnan将为您提供更多信息,或者您可以在C标准中阅读所有信息)

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


94
如果我遇到过if (foo != foo)一些代码,我会发出一个非常可听的“ WTF”。 isnan似乎是一个更清晰易读方法。
亚历克斯·韦恩

5
@Squeegy:对于熟悉浮点的人来说,它们读的相同。对于不是的人,是的,isnan要清楚得多。
斯蒂芬·佳能

2
@AndrewHeinlein:不完全是。x != x除非您使用-ffast-math或类似文件进行编译,否则它将扩展为,在这种情况下,它将扩展为对__isnanf或的调用__isnand(因为x != x在-ffast-math下无法正常工作)。因此,通常最好使用isnan
斯蒂芬·佳能

1
但是,是什么__isnanf__isnand扩大到?
安迪

1
@IulianOnofrei,因为NaN被定义为不等于任何东西,包括NaN。
斯蒂芬·佳能

35

没有什么等于NaN-包括NaN自身。所以检查一下x != x


5
 if(isnan(slope)) {

     yourtextfield.text = @"";
     //so textfield value will be empty string if floatvalue is nan
}
else
{
     yourtextfield.text = [NSString stringWithFormat:@"%.1f",slope];
}

希望这对您有用。


2

在Swift中,您需要slope.isNaN检查它是否为NaN。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.