我在某些代码中遇到了nan
值,我知道如何处理它,但在尝试解释nan的含义时,我意识到自己并不确定。对于我想要澄清的事情,还有一些类似的奇怪值。
inf
这显然意味着无穷大,但是当你达到最大浮动值时会出现这种情况吗?
nan
这究竟是什么意思,什么时候弹出这个值?
nil
我想我确实知道这个。尚未分配的对象的实例。我认为无论如何它都属于这个列表。
null
我不确定这个,但我认为它与nil相似?
答案 0 :(得分:11)
inf
这显然意味着无穷大,但是当你达到最大浮动值时会出现这种情况吗?
这不是ObjC的一部分,除了NSNumber
在保持无限值时将其用作-description
。
NSNumber
内的实际值是double
,由C-定义,实际上,定义主要取决于平台。但是,在大多数平台上,它是IEEE-754 binary64
。 IEEE 754标准定义了affinely extended real number line,具有正无穷大和负无穷大的值以及有限值。它还精确定义了有限计算可以溢出到无穷大的不同方式,以及代码如何控制它。但是,作为一般规则,是的,如果计算超过double
的最大有限值,则得到正无穷大。
nan
这究竟是什么意思,什么时候弹出这个值?
这也主要是关于C和IEEE-754,而不是ObjC(同样,除了-description
的{{1}})。维基百科在NaN
上有一个很好的页面,但是,它简单地表示“非数字”,它用于没有合理价值,甚至无穷大(或者在太多不同值之间不明确的地方)的情况,比如NSNumber
。
0/0
我想我确实知道这个。尚未分配的对象的实例。我认为无论如何它都属于这个列表。
nil
不是对象的实例。 nil
是一个空指针,当 没有要指向的实例时使用。它基本上等同于nil
或(id)0
。
但是“一个尚未分配的对象”不是一个对象,并且不存在,所以...在某种程度上说首先谈论这样的事情是有道理的,我想你可以说(NSObject *)0
是指向它的指针。
nil
我不确定这个,但我认为它与null
类似?
nil
值用作实际存在的占位符对象,但代表什么都没有,在一个你实际上根本没有任何东西的地方(例如,在{ {1}})。
如果您尝试将空指针打印为C字符串(例如+[NSNull null]
),您可能还会看到NSArray
。但是你看到的任何代码实际上都不是合法的C或ObjC代码。
此外,人们常常将null
与NSLog(@"%s", 0)
混淆,这意味着任何空指针。
因此,如果您有null
,NULL
,id
等,并且您没有任何要指向的内容,请使用NSObject *
。当您有一个指向非ObjC值的指针(如NSSomeOtherClass *
),并且您没有指向它的任何内容时,请使用nil
。如果要将空指针放入集合中,请使用int *
。
答案 1 :(得分:2)
NaN表示“不是数字”。
当没有一个合理的数字时,浮点运算会产生NaN。例如,没有sqrt(–1)
可以返回的浮点数,这将是-1的平方根的良好近似值。
NaNs可用于各种事物。软件可以初始化浮点对象以发信号通知NaN,因此使用一个而不首先为其分配值会导致陷阱。
可以静默忽略安静的NaN,以允许完成大量计算,并在以后修复或删除NaN。 (大多数操作传播NaN:如果添加NaN和数字,结果是NaN。)