Как определить, является ли NSNumber Cocoa NaN (а не числом)?Определить, является ли NSNumber NaN
Это возникает, например, при анализе строки с недопустимым (нечисловым) содержимым.
Как определить, является ли NSNumber Cocoa NaN (а не числом)?Определить, является ли NSNumber NaN
Это возникает, например, при анализе строки с недопустимым (нечисловым) содержимым.
Итак, я узнал, что свойство класса [NSDecimalNumber notANumber]
только для этой цели. В некоторых языках NaN! = NaN, но это не так в какао.
На самом деле нет такого объекта для NSNumber, поскольку, если это не число, то, ну, это не NSNumber. Обычным является использование объекта nil для представления этого.
Как утверждает Майк Абдулла, естественным способом представления NaN в какао является nil
, но [NSNumber numberWithDouble:NAN]
действительно возвращает действительный объект. Нет NSNumber
-специальный способ обнаружения этого, но общий способ, isnan([foo doubleValue])
, работает. Если вам не нравятся функции, вы можете вставить ее в категорию.
эй ребята: я почти уверен, что ноль не означает то же самое, что и NaN. Ниль не означает никакой ценности. NaN используется для представления результатов некоторых операций с плавающей запятой (например, деления на ноль) ... так что NaN - это число. Это число «Not A Number» ... – nielsbot
Да, мы это знаем. Дело остается в том, что 'nil' является естественным способом представления таких вещей, как строка с нечисловыми константами, как в примере OP. –
есть функция isnan() я нашел его сегодня.
Любое булево выражение с 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, сравнение будет ложным. И я могу смело избегать вычислений с Нан.
Для десятичных знаков, по крайней мере:
[[NSDecimalNumber notANumber] isEqualToNumber:myNumber]
Я обнаружил, что это работает, но это законно?
NSNumber *NaN = [NSDecimalNumber notANumber];
NSDecimalNumber *x = ... fill it somehow with NaN content ...
if (x == NaN) ... this works
является NaN
guaranteeed, чтобы быть singleton
постоянное значение? Было бы здорово, но я полагаю, что это не так, поскольку все примеры, которые я нашел, используют методы isEqual
.
Несомненно, в документации нет слова «singleton», кажется, что isEqual-ish все проверки. (( – dmitrynikolaev
NaN не является уникальным значением - существуют варианты, в том числе «тихие» NaN и «сигнализация» NaN, а определение кодировки позволяет некоторым несущественным битам (например, знакам) иметь какое-либо значение. По этой причине == NAN не может быть –
Несомненно, это синглтон за кулисами, но лучше использовать sEqual в случае, если это изменение изменится в будущем. – Andy
Чтобы определить 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"
Стоит отметить, что 'isnormal (0)' возвращает 0 (то же, что и 'isnormal (NAN)') , так что, если ноль является потенциально допустимым значением, проверьте как 'inan', так и' isinf'. 'isfinite()' является лучшим вариантом. – Demitri
Мы также можем использовать #define, определенный в математике.ч, как follws
if(isnan(myNumber))
{ // myNumber is NaN .
}
Это решение работает с примитивными типами данных, а не с объектами NSNumber напрямую, вы должны получить значение из NSNumber, например: number.intValue – ObjSal
Просто для ясности, чтобы проверить, если NSNumber является NaN, то код будет выглядеть так: '[NSNumber isEqualToNumber: [NSDecimalNumber notANumber]]'. Это возвращает ДА, если NSNumber - NaN. – SimonB