Objective-C - перевірка плаваючості на нан


78

У мене є змінна ( float slope), яка іноді матиме значення nan при роздрукуванні, оскільки іноді відбувається поділ на 0.

Я намагаюся зробити інше, якщо це трапиться. Як я можу це зробити? if (slope == nan)здається, не працює.


3
можливий дублікат isNan у цілі c
Хорхе Феррейра

1
Objective-C для float або double isnan(slope):; Swift for floatingPointType:slope.isNaN
Cœur

Відповіді:


207

Два шляхи, які більш-менш еквівалентні:

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

Або

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

( man isnanнадасть вам більше інформації, або ви можете прочитати все про це в стандарті С)

Крім того, ви можете виявити, що знаменник дорівнює нулю, перш ніж робити поділ (або використовувати, atan2якщо ви просто збираєтеся використовувати atanна схилі, а не робити якісь інші обчислення).


94
Якщо я коли-небудь зіткнувся if (foo != foo)з яким-небудь кодом, я б видав дуже чутний "WTF". isnanздається набагато чіткішим і читабельнішим методом.
Alex Wayne

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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.