Подтвердить что ты не робот

Является ли добавление с плавающей запятой коммутативным в С++?

Для значений с плавающей запятой гарантируется, что a + b == b + a?

Я считаю, что это гарантировано в IEEE754, однако стандарт С++ не указывает, что IEEE754 должен использоваться. Единственный соответствующий текст, по-видимому, относится к [expr.add] # 3:

Результатом двоичного + оператора является сумма операндов.

Математическая операция "сумма" коммутативна. Однако математическая операция "сумма" также ассоциативна, а сложение с плавающей запятой определенно не ассоциативно. Итак, мне кажется, что мы не можем заключить, что коммутативность "суммы" в математике означает, что эта цитата указывает коммутативность в С++.

4b9b3361

Ответ 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, они позволят вам определить, присутствует ли он, но все еще не требуют его.