【问题标题】:Why is np.nextafter(0, 1) not equivalent to the float64 epsilon value?为什么 np.nextafter(0, 1) 不等于 float64 epsilon 值?
【发布时间】:2018-04-13 14:03:52
【问题描述】:

这很奇怪!

np.nextafter 返回 0 之后的最小数字。这不应该等于 float64 epsilon 吗?

In [25]: np.nextafter(0, 1).dtype == np.finfo(np.float64).eps.dtype
Out[25]: True

In [26]: np.nextafter(0, 1) < np.finfo(np.float64).eps
Out[26]: True

【问题讨论】:

    标签: python numpy scipy floating-point


    【解决方案1】:

    float64 epsilon 是相对于 1.0 计算的。 不是64位浮点可表示的最小正数。

    要使用np.nextafter() 找到它,请使用np.nextafter(1, 2) - 1

    In [215]: np.nextafter(1, 2) - 1
    Out[215]: 2.220446049250313e-16
    
    In [216]: np.finfo(np.float64).eps
    Out[216]: 2.220446049250313e-16
    

    【讨论】:

      【解决方案2】:

      浮点数由以下部分组成:

      • 符号:+ 或 -。
      • 某个基数 b 中的某些 n 位数字,包括小数点或小数点:d0 .d-1d-2d-3 sub>…d-(n-1).
      • 基础 b 提升到某个幂 ebe

      对数字加符号,结果乘以be,所以整数为± d0.d-1d-2d-3d-(n-1)be。在计算中,b 通常是 2,表示每个数字是一个位。在常见的 IEEE-754 基本 64 位二进制浮点格式中,n 为 53。

      所谓机器ε就是指数ed-(n-1)的位值/em> 为 0。换句话说,机器 epsilon 为 +0.000…1 • b0,等于 b- (n-1)。对于常见的 64 位格式,这是 2-52

      在任何浮点格式中,e 允许具有的最小值(因为它必须适合为其保留的位字段)。对于常见的 64 位格式,这是 -1022。因此,这种格式的浮点数可以具有的最小正值是 +0.000…1 • 2-1022。这等于 2-52 • 2-1022 = 2-1074

      换句话说,机器 epsilon 会告诉您接近 1 的浮点数的步长。步长取决于指数,因此对于较大的数字来说它更大,对于较小的数字来说它更小。接近零时,步长为 2-1074

      【讨论】:

        猜你喜欢
        • 2021-10-31
        • 2013-08-17
        • 1970-01-01
        • 1970-01-01
        • 2019-01-04
        • 2015-08-28
        • 1970-01-01
        • 2021-04-02
        • 2012-12-05
        相关资源
        最近更新 更多