2009-04-05 4 views

ответ

61

Итак, я узнал, что свойство класса [NSDecimalNumber notANumber] только для этой цели. В некоторых языках NaN! = NaN, но это не так в какао.

+40

Просто для ясности, чтобы проверить, если NSNumber является NaN, то код будет выглядеть так: '[NSNumber isEqualToNumber: [NSDecimalNumber notANumber]]'. Это возвращает ДА, если NSNumber - NaN. – SimonB

-2

На самом деле нет такого объекта для NSNumber, поскольку, если это не число, то, ну, это не NSNumber. Обычным является использование объекта nil для представления этого.

15

Как утверждает Майк Абдулла, естественным способом представления NaN в какао является nil, но [NSNumber numberWithDouble:NAN] действительно возвращает действительный объект. Нет NSNumber -специальный способ обнаружения этого, но общий способ, isnan([foo doubleValue]), работает. Если вам не нравятся функции, вы можете вставить ее в категорию.

+0

эй ребята: я почти уверен, что ноль не означает то же самое, что и NaN. Ниль не означает никакой ценности. NaN используется для представления результатов некоторых операций с плавающей запятой (например, деления на ноль) ... так что NaN - это число. Это число «Not A Number» ... – nielsbot

+1

Да, мы это знаем. Дело остается в том, что 'nil' является естественным способом представления таких вещей, как строка с нечисловыми константами, как в примере OP. –

5

есть функция isnan() я нашел его сегодня.

0

Любое булево выражение с NaN всегда будет возвращать false. Но как это полезно?

Я получал Nan обратно из locationInView: при обработке некоторых жестов в приложении для iPhone. И было очень приятно найти, что любое булево выражение с NaN всегда будет возвращать false. Я положил это на использование liek ниже:

// Я использовал UIPanGestureRecognizer, и кажется, что на TouchUp я бы получил Nan для/location .x - .y - довольно разумно, так как в этом случае конец касания не имеет места.

CGPoint location = [gestureRecognizer locationInView:self]; 

if (location.x != location.x || location.y != location.y) 
{ 
return; 
} 

Итак, как долго .x и .y или законные значения с плавающей точкой, конечно, они никогда не будут не равны там собственное значение. НО в случае .x или .y, являющихся NaN, сравнение будет ложным. И я могу смело избегать вычислений с Нан.

10

Для десятичных знаков, по крайней мере:

[[NSDecimalNumber notANumber] isEqualToNumber:myNumber] 
6

Я обнаружил, что это работает, но это законно?

NSNumber *NaN = [NSDecimalNumber notANumber]; 

NSDecimalNumber *x = ... fill it somehow with NaN content ... 

if (x == NaN) ... this works 

является NaN guaranteeed, чтобы быть singleton постоянное значение? Было бы здорово, но я полагаю, что это не так, поскольку все примеры, которые я нашел, используют методы isEqual.

+0

Несомненно, в документации нет слова «singleton», кажется, что isEqual-ish все проверки. (( – dmitrynikolaev

+0

NaN не является уникальным значением - существуют варианты, в том числе «тихие» NaN и «сигнализация» NaN, а определение кодировки позволяет некоторым несущественным битам (например, знакам) иметь какое-либо значение. По этой причине == NAN не может быть –

+0

Несомненно, это синглтон за кулисами, но лучше использовать sEqual в случае, если это изменение изменится в будущем. – Andy

8

Чтобы определить NSNumber является NaN, преобразовать его в двойной и использовать функцию C isnan():

NSNumber *validNumber = [NSNumber numberWithDouble: 1.]; 
NSLog(@"%d", isnan(validNumber.doubleValue)); // prints "0" 

NSNumber *nanNumber = [NSNumber numberWithDouble: 0./0.]; 
NSLog(@"%d", isnan(nanNumber.doubleValue)); // prints "1" 

Однако, вы должны быть осторожны, потому что есть другие специальные значения, например:

NSNumber *posInfinity = [NSNumber numberWithDouble: 1./0.]; 
NSLog(@"%d", isnan(posInfinity.doubleValue)); // prints "0" 

Если вы хотите, чтобы проверить эти ценности, а также, то лучше использовать isnormal() вместо:

NSLog(@"%d", isnormal(validNumber.doubleValue)); // prints "1" 
NSLog(@"%d", isnormal(nanNumber.doubleValue)); // prints "0" 
NSLog(@"%d", isnormal(posInfinity.doubleValue)); // prints "0" 
+0

Стоит отметить, что 'isnormal (0)' возвращает 0 (то же, что и 'isnormal (NAN)') , так что, если ноль является потенциально допустимым значением, проверьте как 'inan', так и' isinf'. 'isfinite()' является лучшим вариантом. – Demitri

2

Мы также можем использовать #define, определенный в математике.ч, как follws

if(isnan(myNumber)) 
{ // myNumber is NaN . 

}

+1

Это решение работает с примитивными типами данных, а не с объектами NSNumber напрямую, вы должны получить значение из NSNumber, например: number.intValue – ObjSal