为什么NaN值的比较与所有其他值的行为不同?也就是说,与运算符==,<=,> =,<,>的所有比较(其中一个或两个值为NaN)返回false,这与所有其他值的行为相反.
我想这可以通过某种方式简化数值计算,但我找不到明确说明的理由,甚至在Kahan 的IEEE 754状态讲义中也没有详细讨论其他设计决策.
这种异常行为在进行简单数据处理时会造成麻烦.例如,当在C程序中对某些实值字段的记录列表进行排序时,我需要编写额外的代码来处理NaN作为最大元素,否则排序算法可能会变得混乱.
编辑: 迄今为止的答案都认为比较NaNs毫无意义.
我同意,但这并不意味着正确的答案是错误的,而是一个非布尔值(NaB),幸运的是它不存在.
因此,在我看来,选择返回真或假的比较是任意的,对于一般数据处理,如果它遵循通常的定律(==的反射性,<= =,>的三分法),那将是有利的,以免数据结构依赖这些法律变得困惑.
因此,我要求打破这些法律的一些具体优势,而不仅仅是哲学推理.
编辑2: 我想我现在理解为什么使NaN最大化是一个坏主意,它会搞砸上限的计算.
可能需要NaN!= NaN以避免检测环路中的收敛,例如
while (x != oldX) {
oldX = x;
x = better_approximation(x);
}
Run Code Online (Sandbox Code Playgroud)
然而,最好通过比较绝对差异与小限制来编写.所以恕我直言,这是打破NaN反身性的一个相对弱的论据.
如果出现错误,我有一个可以返回nan或inf的数值方法,并且为了测试目的,我想暂时强制它返回nan或inf以确保正确处理情况.是否有一种可靠的,独立于编译器的方法来在C中创建nan和inf的值?
谷歌搜索大约10分钟后,我只能找到编译器相关的解决方案.
当我检查它在列表或集合中的存在时,NaN处理得很好.但我不明白怎么做.[更新:不,不是; 如果找到相同的NaN实例,则报告存在; 如果只发现不同的NaN实例,则报告为缺席.
我认为列表中的存在是通过相等来测试的,所以我预计NaN不会被发现,因为NaN!= NaN.
hash(NaN)和hash(0)都是0.字典和集合如何告诉NaN和0分开?
使用in运算符检查任意容器中NaN的存在是否安全?还是依赖于实现?
我的问题是关于Python 3.2.1; 但如果在未来的版本中存在/计划的任何更改,我也想知道.
NaN = float('nan')
print(NaN != NaN) # True
print(NaN == NaN) # False
list_ = (1, 2, NaN)
print(NaN in list_) # True; works fine but how?
set_ = {1, 2, NaN}
print(NaN in set_) # True; hash(NaN) is some fixed integer, so no surprise here
print(hash(0)) # 0
print(hash(NaN)) # 0
set_ = {1, 2, 0}
print(NaN in set_) # False; works fine, but how?
Run Code Online (Sandbox Code Playgroud)
请注意,如果我将一个用户定义的类的实例添加到a list …
我想知道是否可以通过例如指定其名称来将值传递给特定参数,而不考虑该参数是第一个,第二个还是第100个.
例如,在Python中,您可以轻松地执行以下操作:
def myFunction(x, y):
pass
myFunction(y=3);
Run Code Online (Sandbox Code Playgroud)
我真的需要将一个值传递给一个特定的参数,我不知道它在参数枚举中的位置.我已经搜索了一段时间,但似乎没有任何效果.
我知道我可以通过以下方式在 Python 中获得 nan
>>>float("nan")
nan
Run Code Online (Sandbox Code Playgroud)
但是没有“nan”还有其他方法可以得到它吗?就像在 Javascript 中一样,我可以做到
>"something"-1
NaN
Run Code Online (Sandbox Code Playgroud)
我可以在 Python 中做类似的事情吗?谢谢。
我试图用误差线绘制一个系列。该系列可能包含 None 值。不使用错误时 - 绘制的系列没有错误。尝试使用误差线绘图时 - 我收到此错误:
我的代码是:
x = [10.4, 11.12,11.3,None, 10.2,11.3]
y = [0.3, 1.2, 0.7, None, 1.1, 0.4]
y_err = [0.01, 0.04, 0.07, None, 0.01, 0.05]
plt.plot(x,y, 'o', color='r') # this one works. I get a plot with 5 points. The null point is skipped
plt.errorbar(x,y,yerr=y_err) # this one doesn't work
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
TypeError: unsupported operand type(s) for -: 'NoneType' and 'NoneType'
Run Code Online (Sandbox Code Playgroud)
有没有办法跳过系列中的空值?
谢谢!
nan ×3
python ×3
c ×1
comparison ×1
containers ×1
equality ×1
iec10967 ×1
ieee-754 ×1
javascript ×1
math ×1
matplotlib ×1
parameters ×1
python-3.x ×1