zoukankan      html  css  js  c++  java
  • Python中的inf与nan

    Python中可以用如下方式表示正负无穷

    >>> float('inf') # 正无穷,inf不区分大小写,float('InF')一样可以。
    inf
    >>> float('-inf') # 负无穷,不区分大小写。
    -inf
    

    当涉及 > 和 < 运算时, 所有数都比 -inf 大 ,所有数都比 +inf 小。
     

    >>> float('nan')
    nan
    

    nan代表Not A Number(不是一个数),它并不等于0,因为nan不是一个数,所以相关计算都无法得到数字。


    正无穷float('inf')

    >>> float('inf') + 100
    inf
    >>> float('inf') - 100
    inf
    >>> float('inf') * 100
    inf
    >>> float('inf') / 100
    inf
    >>> float('inf') + float('inf')
    inf
    >>> float('inf') - float('inf')
    nan
    >>> float('inf') * float('inf')
    inf
    >>> float('inf') / float('inf')
    nan
    >>> 100 + float('inf')
    inf
    >>> 100 - float('inf')
    -inf
    >>> 100 * float('inf')
    inf
    >>> 100 / float('inf')
    0.0
    

    负无穷float('inf')

    >>> float('-inf') + 100
    -inf
    >>> float('-inf') - 100
    -inf
    >>> float('-inf') * 100
    -inf
    >>> float('-inf') / 100
    -inf
    >>> float('-inf') + float('-inf')
    -inf
    >>> float('-inf') - float('-inf')
    nan
    >>> float('-inf') * float('-inf')
    inf
    >>> float('-inf') / float('-inf')
    nan
    >>> 100 + float('-inf')
    -inf
    >>> 100 - float('-inf')
    inf
    >>> 100 * float('-inf')
    -inf
    >>> 100 / float('-inf')
    -0.0
    

    可见,正无穷float('inf')与负无穷float('inf')运算有着异曲同工之妙。


    正无穷float('inf')与负无穷float('inf')之间的运算:

    >>> float('inf') + float('-inf')
    nan
    >>> float('inf') - float('-inf')
    inf
    >>> float('-inf') - float('inf')
    -inf
    >>> float('inf') * float('-inf')
    -inf
    >>> float('inf') / float('-inf')
    nan
    >>> float('-inf') / float('inf')
    nan
    

    NaN
    所有涉及nan的操作,返回的都是nan。

    >>> float('nan') + 100
    nan
    >>> float('nan') - 100
    nan
    >>> float('nan') * 100
    nan
    >>> float('nan') / 100
    nan
    

     
    比较操作时,返回的都是False,哪怕两个float('nan')互相比较都不相等。

    >>> float('nan') > float('inf')
    False
    >>> float('nan') > float('-inf')
    False
    >>> float('nan') < float('inf')
    False
    >>> float('nan') < float('-inf')
    False
    >>> float('nan') == float('nan') # 注意
    False
    

    Python中可以用math.isinf()与math.isnan()来判断数据是否为inf或nan。

    >>> import math
    >>> math.isinf(float('inf'))
    True
    >>> math.isinf(float('-inf'))
    True
    >>> math.isnan(float('nan'))
    True
    

    除此之外,还有别的方法可以用来判断数据是否为inf和nan,但上述方法是最推荐的,所以其他方法不再赘述。


    正负无穷与NaN的is和==判断

    >>> inf = float("inf")
    >>> ninf = float("-inf")
    >>> nan = float("nan")
    >>> inf is inf
    True
    >>> ninf is ninf
    True
    >>> nan is nan
    True
    >>> inf == inf
    True
    >>> ninf == ninf
    True
    >>> nan == nan
    False
    >>> inf is float("inf")
    False
    >>> ninf is float("-inf")
    False
    >>> nan is float("nan")
    False
    >>> inf == float("inf")
    True
    >>> ninf == float("-inf")
    True
    >>> nan == float("nan")
    False
    

    首先,对于正负无穷和 NaN 自身与自身用 is 操作,结果都是 True,这里好像没有什么问题;但是如果用 == 操作,结果却不一样了, NaN 这时变成了 False。如果分别用 float 重新定义一个变量来与它们再用 is 和 == 比较,结果仍然出人意料。出现这种情况的原因稍稍有些复杂,这里就不赘术了,感兴趣可以查阅相关资料。
    既然我在谈论这个问题,就再忠告:不要在 Python 中试图用 is 和 == 来判断一个对象是否是正负无穷或者 NaN。乖乖的用 math 模块就OK了,否则就是引火烧身。

  • 相关阅读:
    鼠标事件&键盘事件
    监听/移除事件 & 事件流 & 事件对象 & 事件委托
    javaScript操作cookie出现同名key
    Vue入门干货,以及遇到的坑
    WPF中Popup上的textbox无法切换到中文输入法
    RichTextBox FlowDocument类型操作
    Web微信协议
    计算机专业术语对照
    Ext.Net一般处理程序上传文件
    C# ObjectCache、OutputCache缓存
  • 原文地址:https://www.cnblogs.com/malinqing/p/11290131.html
Copyright © 2011-2022 走看看