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?
java.lang.NumberFormatException: Infinite or NaN原因之浮点类型除数为0结果探究