【问题标题】:double precision and single precision floating point numbers?双精度和单精度浮点数?
【发布时间】:2018-02-23 12:23:36
【问题描述】:

我想知道为什么双精度和单精度数字有时相等,有时不相等。例如,当我有以下情况时,它们不相等:

import numpy as np

x=np.float64(1./3.)
y=np.float32(1./3.)

但以下是相等的:

x=np.float64(3.)
y=np.float32(3.)

我理解为什么第一组 x 和 y 不相等,但我不太确定为什么第二组相等。

【问题讨论】:

    标签: python numpy floating-point precision single-precision


    【解决方案1】:

    这个答案假设 single 是 IEEE 754 32 位二进制浮点数,double 是对应的 64 位类型。

    任何可以精确表示为单精度的值也可以精确表示为双精度。 3.0 就是这种情况。最接近的单曲和最近的双曲的值都恰好为 3,并且相等。

    如果一个数字不能精确地表示为单数,则双数可能是更接近的近似值,并且与单数不同。 1.0/3.0 就是这种情况。最接近的单曲是 0.3333333432674407958984375。最接近的双精度为 0.333333333333333314829616256247390992939472198486328125。

    single 和 double 都是二进制浮点数。一个数字不能精确表示,除非它等于A/(2**B) 形式的分数,其中 A 是整数,B 是自然数,“**”代表指数。诸如 0.1 和 0.2 之类的终止十进制分数但不终止二进制分数的数字的行为类似于 1/3.0。例如,最接近 0.1 的单曲是 0.100000001490116119384765625,最近的双曲是 0.1000000000000000055511151231257827021181583404541015625

    【讨论】:

    • 第一个不等式实际上适用于像 0.2 这样的数字。如果我有 x=np.float64(0.2) 和 y=np.float32(0.2) 当我执行 x==y 时,它会打印出 False。 0.2 不是精确地表示在一个单一的吗?
    • @MSB 我已经回复了您在答案中的评论。
    【解决方案2】:

    假设您必须以有限的位数表示以 10 为底的 1/3。

    使用 2 位数字(我们称之为单精度),它将是 0.33
    4 位数字(双精度)为 0.3333
    所以这两个近似值不相等。

    现在将其转换为以 2 为底的 1/5。您还需要无限数量的位(二进制数字) - 它是 0.001100110011....

    使用 24 位有效位(IEEE 754 单精度)和 53 位有效位(双精度),这两个浮点近似值会有所不同。

    1/3 也一样...

    如果数字可以精确表示而无需单精度近似,则两种表示将相等。

    这是一个小于 25 位的分子(不带尾随零),分母是 2 的幂。(但在分子和分母中的指数都不太高......)。

    例如 1/2 3/2 5/2 ... 1/4 3/4 5/4 等...将具有相同的代表性。

    2^24+1 不会有相同的表示。
    但是 2^60 会。

    还有其他情况表示不精确但近似值相同:
    2^54+1 将具有相同的浮点数和双近似值。
    例如 1+2^-60 也是如此。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-06
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-19
      相关资源
      最近更新 更多