如果两个整数的乘积落在浮点类型的无损范围内,将无损吗?

问题描述 投票:3回答:1

Single PrecisionDouble Precision IEEE 754基2浮点值可以表示整数范围,而不会丢失。

[乘积A = BC,其中BC是无损表示为浮点值的整数,如果乘积A在数学上落在浮点类型的无损范围内,则它总是无损吗?

更具体地说,我们是否知道普通的现代处理器是否可以确保对乘积进行计算,以使整数乘积具有如上所述的作用?

编辑:为了澄清每个链接,可以无损失表示的整数范围在双精度中为+ -2 53,在单精度中为+ -16777216。

编辑:IEEE-754要求将操作四舍五入到最接近的可表示精度,但我特别想了解现代处理器的行为

floating-point precision floating-accuracy processor
1个回答
3
投票

对于任何基本运算,IEEE-754要求,如果数学结果是可表示的,那么它就是结果。

该问题没有用IEEE-754标记,因此通常只询问浮点数。当精确的结果可表示时,没有一个明智的系统会给出不准确的结果,但是仍然有可能创建一个准确的结果。


-3
投票

让我们专注于IEEE-754单精度。

在此代码中,尾数使用23 + 1位编码,不需要编码的位数不超过24位的整数可以用浮点数精确表示(即,其绝对值在1到2 ^ 24-1范围内的整数)。

但是,在此范围之上,其他整数也可以精确编码。例如2 ^ 24或2 ^ 30 + 2 ^ 28。

通常,确定数字是否可以正确编码的不是范围,而是整数代码中1的数目和分布。如果考虑数字的二进制表示形式,并且调用k最左边的位的索引为1和l最右边的位的索引为1,则如果

,则可以对整数进行精确编码
  • kl <= 23

  • k <= 127(具有遵守SP标准的指数)

这些是| A | = M×2 ^ e形式的整数,其中M <2 ^ 24和A <2 ^ 128。

如果我们做两个数字AB的乘积,并假设| A |,|| [[B | <2 ^ 24,则所有可能]

  • 如果结果为

    A

×B <2 ^ 24,则可以完全对其进行编码,因为它不需要编码超过24位
  • 如果结果为

    A

  • ×B] >> 2 ^ 24,则它不在范围内,但可能会被正确编码。例如A = 2 ^ 22和B = 2 ^ 5,A×B = 2 ^ 27可以准确编码。
  • 但通常,如果将两个24位尾数相乘,则需要48位来表示整数结果。极值索引(上面称为

    k

  • -l)的索引的差值小于24的可能性很小。例如,A = 2 ^ 24-1 B = 2 ^ 24-2,乘积A×B不能用24位精确表示。
    所以回答您的问题,如果|

    A |,| B | <2 ^ 24,如果| A×B | <2 ^ 24,A×B] >可以精确编码。如果| A×B |≥2^ 24,则可能会进行无损编码,但通常不正确。当然,当尾数为52 + 1位时,这可以扩展为双精度。

    如果处理器遵守IEEE-754标准,则它完全独立于处理器体系结构。它取决于IEEE-754标准定义数字代码的方式。

    © www.soinside.com 2019 - 2024. All rights reserved.