"NaN" 的困扰

来源:互联网 发布:聪明的投资者 知乎 编辑:程序博客网 时间:2024/05/23 00:39

NaN ("Not a Number") 是一种特殊的浮点类型,IEEE754在1985年的时候引入,用于定义一些未定义的浮点运算产生的结果。NaN 不同与 inf or -inf,它并非是一种具体的浮点数值,它一种未定义的浮点操作所产生的结果,可以理解成是另外一种对象,目前在很多语言里面都引入了该定义,如 python, matlab 等等。当然,在计算的时候,通常很少会碰见 NaN,但一旦出现就会造成计算结果异常,而且是伴随在很多迭代或者计算过程中。由于,很多语言都把NaN当成一种数据类型来处理,出现的时候并不会报错或者异常,这无疑是程序的定时炸弹,尤其是那些会涉及到很多矩阵迭代计算的程序。LZ 就吃了这个苦头,在调用随机梯度下降的时候,通常需要迭代很多次计算才会使算法收敛。当出现NaN的时候,有一个很明显的特征矩阵计算的速度会比平时慢 10-100 times,如果你的程序突然间遇到这种情况,最后返回去仔细检查一下在那些地方会引入 NaN 的。下面列举几种会产生 NaN 的操作

会返回 NaN 的运算有如下三种:

  • 操作数中至少有一个是 NaN 的运算
  • 未定义操作
    • 下列除法运算:0/0、∞/∞、∞/−∞、−∞/∞、−∞/−∞
    • 下列乘法运算:0×∞、0×-∞
    • 下列加法运算:∞ + (−∞)、(−∞) + ∞
    • 下列减法运算:∞ - (−∞)、(−∞) - ∞
  • 产生复数结果的实数运算。例如:
    • 对负数进行开方运算
    • 对负数进行对数运算
    • 对比-1小或比+1大的数进行反正弦或反余弦运算



0 0
原创粉丝点击