Floating point NaN的不一致性

Floating point NaN的不一致性,floating-point,julia,nan,Floating Point,Julia,Nan,在涉及NaN的某些操作下,结果不一致 将NaN和0/0乘以false 0/0 # returns NaN NaN*false # returns 0.0 (0/0)*false # returns -0.0 这不是NaN的矛盾吗? 此外: 但是: 另一个不一致?我的意思是。。。有人依赖这种行为吗?第一种是有意义的,因为从技术上讲,NaN有一个符号没有显示出来,因为你为什么想要它。对第二个毫无线索,这真的很奇怪,我想这和朱莉娅无关。操作nanany\u op anyfloat似乎返回程序集级别的

在涉及NaN的某些操作下,结果不一致

将NaN和0/0乘以false

0/0 # returns NaN
NaN*false # returns 0.0
(0/0)*false # returns -0.0
这不是NaN的矛盾吗? 此外:

但是:


另一个不一致?

我的意思是。。。有人依赖这种行为吗?第一种是有意义的,因为从技术上讲,
NaN
有一个符号没有显示出来,因为你为什么想要它。对第二个毫无线索,这真的很奇怪,我想这和朱莉娅无关。操作
nanany\u op anyfloat
似乎返回程序集级别的第一个参数。正如@Oscar在第一种情况下所指出的,你的
NaN
有一个否定符号,而在第二种情况下它没有。更麻烦的是这个定义是
ifelse(x,y,copysign(零(y),y))
乘以
Bool
和float(这与Julia有关:))。这意味着
false*NaN
0.0
,但是
true*NaN
NaN
。但也许这是有意的——不确定。这实际上是有一个很好的理由的。需要使稀疏矩阵工作。将
false
设为强零允许稀疏乘法自由使用高效算法,同时与密集乘法具有相同的结果。
(NaN*(0/0))*false # returns 0.0
((0/0)*NaN)*false # returns -0.0