Является ли добавление с плавающей запятой коммутативным в С++?
Для значений с плавающей запятой гарантируется, что a + b == b + a
?
Я считаю, что это гарантировано в IEEE754, однако стандарт С++ не указывает, что IEEE754 должен использоваться. Единственный соответствующий текст, по-видимому, относится к [expr.add] # 3:
Результатом двоичного + оператора является сумма операндов.
Математическая операция "сумма" коммутативна. Однако математическая операция "сумма" также ассоциативна, а сложение с плавающей запятой определенно не ассоциативно. Итак, мне кажется, что мы не можем заключить, что коммутативность "суммы" в математике означает, что эта цитата указывает коммутативность в С++.
Ответы
Ответ 1
Не требуется даже a + b == a + b
. Один из подвыражений может содержать результат сложения с большей точностью, чем другой, например, когда использование нескольких дополнений требует, чтобы одно из подвыражений, которое временно хранилось в памяти, когда другое подвыражение может храниться в регистре ( с более высокой точностью).
Если a + b == a + b
не гарантируется, a + b == b + a
не может быть гарантировано. Если a + b
не нужно возвращать одно и то же значение каждый раз, а значения разные, одно из них обязательно не будет равно одной конкретной оценке b + a
.
Ответ 2
Нет, язык С++ вообще не будет делать такого требования к оборудованию. Определена только ассоциативность операторов.
Всевозможные сумасшедшие вещи происходят в арифметике с плавающей запятой. Возможно, на какой-то машине добавление нуля к денормальному номеру приводит к нулю. Понятно, что машина может избежать обновления памяти в случае добавления нулевого знака в денормальное значение в памяти. Возможно, что действительно немой компилятор всегда помещает LHS в память и RHS в регистр.
Обратите внимание, однако, что машине с некоммутативным добавлением нужно будет конкретно определить, как выражения сопоставляются с инструкциями, если вы собираетесь контролировать какой операции вы получаете. Включает ли левая сторона в первый машинный операнд или второй?
Такая спецификация ABI, указывающая на построение выражений и инструкций на одном дыхании, будет довольно патологической.
Ответ 3
Стандарт С++ очень конкретно не гарантирует IEEE 754. Библиотека имеет некоторую поддержку IEC 559 (которая в основном является только версией стандарта IEC стандарта IEEE 754), поэтому вы можете проверить, использует ли базовая реализация IEEE 754/МЭК 559, хотя (и когда он это делает, вы можете зависеть от того, что он гарантирует, конечно).
По большей части, стандарты C и С++ предполагают, что такие базовые операции будут реализованы, однако основное оборудование работает. Для чего-то такого же общего, как IEEE 754, они позволят вам определить, присутствует ли он, но все еще не требуют его.