提问人:user2052436 提问时间:7/7/2022 更新时间:7/7/2022 访问量:145
将浮点数与乘以 2 的准确性
Accuracy of adding float number to itself vs multiplication by 2
问:
将 a / 乘以 2 应该是精确的,因为它只会增加指数部分。float
double
将两个相同值的浮点数相加怎么样?会准确吗?
(如果重要的话,硬件是标准的 x86-64)。
答:
2赞
Eric Postpischil
7/7/2022
#1
当使用 IEEE-754 浮点运算或任何合理的浮点运算时,x o y 的结果(其中“o”是任何运算)是通过使用实数算术执行 x o y,然后将实数结果四舍五入到最接近的值,该值可直接以浮点格式表示,由用于运算的舍入规则直接表示。(四舍五入到最接近的平数是最常见的规则,也是最常见的默认值,但还有其他规则,例如向上舍入 [朝向 +∞]、向下舍入和向零舍入。(此确定浮点结果的规则适用于基本运算。对于难以计算的函数,例如 ,并不总是提供正确舍入的结果。pow
因此,获得的结果仅取决于实数结果。在计算 2 • x 中,实数结果为 2x。在计算 x + x 中,实数结果为 2 x。由于这些运算具有相同的实数结果,因此它们将具有相同的浮点结果。
如果浮点格式的基数是 2,并且我们从格式中可表示的数字 x 开始,则 2x 也是可表示的,除非它溢出格式的有限范围。如果它没有溢出,则结果为 2x,因此操作是准确的。
如果浮点格式使用其他基数,则结果可能不准确。例如,对于三位数十进制格式,7.89 是可表示的,但 2•7.89 = 15.78 是不可表示的,因此生成的结果 15.8 将不准确。但是,2•7.89 和 7.89+7.89 的情况相同。即使基数是 2 的幂,乘以 2 也可能不准确。例如,对于三位数八进制格式,5.43 8 是可表示的,但 2•5.438 = 13.068 是不可表示的。
评论