浮点运算的结合性
在编程领域,浮点数通常用于表示实数。然而,这些浮点值的加法和乘法的基本运算可能并不总是如预期的那样。
经常出现的一个问题是浮点加法和乘法是否具有关联性。结合性意味着操作数相加或相乘的顺序不会影响最终结果。虽然乘法对于浮点数确实具有关联性,但加法则不然。
观察以下代码时,这种关联性的缺乏变得很明显:
cout << ((0.7 + 0.2 + 0.1) == 1) << endl; //output is 0 cout << ((0.7 + 0.1 + 0.2) == 1) << endl; //output is 1
这种令人费解的行为是由固有的不精确性引起的浮点数。当添加多个数字时,由于舍入错误,执行加法的顺序可能会导致结果略有不同。
开创性论文“每个计算机科学家应该了解浮点运算”阐明了这个问题:
“另一个灰色区域涉及括号的解释。由于舍入误差,代数结合律不一定成立例如,当 x = 1e30、y = -1e30 且 z = 1 时,表达式 (x y) z 的答案与 x (y z) 完全不同(前一种情况为 1,后一种情况为 0)。 )。
因此,在依赖浮点加法的结合性时必须小心。操作数的添加顺序可能会微妙地改变结果,从而导致意外的行为。
以上是浮点加法是否具有结合律?的详细内容。更多信息请关注PHP中文网其他相关文章!