【问题标题】:What is inf and nan?什么是inf和nan?
【发布时间】:2013-07-13 08:59:18
【问题描述】:

只是一个我有点困惑的问题

所以我在搞乱float('inf'),有点想知道它的用途。

我还注意到,如果我添加 -inf + inf 我得到 nan 是否与零相同。

我对这两个值的用途感到困惑。

另外,当我执行nan - inf 时,我没有得到-inf 我得到nan 我确信这一切都很简单,但我偶然发现了它们并且不知道它们是做什么的。

【问题讨论】:

    标签: python python-2.7


    【解决方案1】:

    inf 是无穷大 - 一个大于任何其他值的值。 -inf 因此小于任何其他值。

    nan 代表 Not A Number,它不等于 0

    虽然可以说正无穷和负无穷关于0 是对称的,但对于任何值n 都可以这样说,这意味着两者相加的结果是nan。这个想法在this math.se question 中讨论过。

    因为nan(字面意思)不是数字,所以不能用它做算术运算,所以第二次运算的结果也不是数字(nan

    【讨论】:

      【解决方案2】:

      nan 的意思是“不是数字”,这是一个浮点值,如果您执行的计算结果不能以数字表示。您使用NaN 执行的任何计算也将产生NaN

      inf 表示无穷大。

      例如:

      >>> 2*float("inf")
      inf
      >>> -2*float("inf")
      -inf
      >>> float("inf")-float("inf")
      nan
      

      【讨论】:

        【解决方案3】:

        Inf 是无穷大,它是一个“比所有其他数字都大”的数字。尝试从中减去任何你想要的东西,它不会变得更小。所有号码都是< Inf-Inf 类似,但比一切都小。

        NaN 表示非数字。如果你尝试做一个没有意义的计算,你会得到NaNInf - Inf 就是这样一种计算。通常NaN 仅用于表示缺少某些数据。

        【讨论】:

          【解决方案4】:

          你说:

          当我做nan - inf 我没有得到-inf 我得到nan

          这是因为任何包含NaN 作为操作数的操作都会返回NaN

          NaN 比较会返回无序结果

          >>> float('Inf') == float('Inf')
          True
          >>> float('NaN') == float('NaN')
          False
          

          【讨论】:

            【解决方案5】:

            我使用 inf/-inf 作为初始值来查找测量的最小值/最大值。假设您使用传感器测量温度,并且想要跟踪最低/最高温度。传感器可能提供有效温度或可能损坏。伪代码:

            # initial value of the temperature
            t = float('nan')          
            # initial value of minimum temperature, so any measured temp. will be smaller
            t_min = float('inf')      
            # initial value of maximum temperature, so any measured temp. will be bigger
            t_max = float('-inf')     
            while True:
                # measure temperature, if sensor is broken t is not changed
                t = measure()     
                # find new minimum temperature
                t_min = min(t_min, t) 
                # find new maximum temperature
                t_max = max(t_max, t) 
            

            上面的代码之所以有效,是因为inf/-inf/nan对于min/max操作都是有效的,所以不需要处理异常。

            【讨论】: