浮点算术:探索浮点运算中的关联性
在编程领域,浮点数对于工作至关重要具有连续值。然而,浮点运算有时可能与我们在学校学到的数学不同,尤其是在结合性方面。
考虑将三个浮点值相加并将它们与 1 进行比较的示例:
奇怪的是,这两个表达式产生不同的结果。这种差异源于浮点加法并不总是结合的事实。换句话说,改变添加值的顺序可以改变最终结果。
非结合性现象是由于浮点表示的限制而产生的。浮点数使用具有有限位数的二进制格式,这限制了它们的精度。因此,浮点数计算可能会引入在多次运算中累积的舍入误差。
在上面的示例中,根据顺序添加 0.7、0.2 和 0.1 会导致中间值略有不同的操作。这些细微的差异通过后续的加法传播,最终导致不同的最终结果。
为了进一步理解这个概念,让我们考虑 David Goldberg 的开创性论文“每个计算机科学家应该了解浮点运算”中的一个示例:
在这种情况下,括号对结果影响很大。将 1e30 和 -1e30 添加到括号中会因四舍五入而产生接近于零的值,然后将其添加到 1。另一方面,将 1e30 和 -1e30 1 的结果相加会产生一个非零值。
因此,在使用浮点算术时,了解潜在的非结合性并在操作涉及重复加法或其他操作的表达式时保持谨慎至关重要。关联运算。
以上是为什么浮点加法并不总是遵循结合律?的详细内容。更多信息请关注PHP中文网其他相关文章!