Стандарт определяет обобщенную сумму следующим образом: цифра c .defns
Определить GENERALIZED_NONCOMMUTATIVE_SUM (op, a1, ..., aN) следующим образом:
a1, когда N равно 1, в противном случае
op (GENERALIZED_NONCOMMUTATIVE_SUM (op, a1, ..., aK), op (GENERALIZED_NONCOMMUTATIVE_SUM (op , aM, ..., aN)) для любого K, где 1
Определить GENERALIZED_SUM (op, a1, ..., aN) как GENERALIZED_NONCOMMUTATIVE_SUM (op, b1, ..., bN) где b1, ..., bN может быть любой перестановкой a1, ..., aN.
Итак, порядок суммирования, а также порядок операндов не указан. Так что если двоичная операция не является коммутативной или не ассоциативной, результат не уточняется.
Это также явно указано здесь .
Относительно того, почему: он дает поставщикам библиотек больше свободы, поэтому они могут или не могут реализовать его лучше. В качестве примера, где реализация может извлечь выгоду из коммутативности. Рассмотрим сумму a+b+c+d+e
, сначала мы вычисляем a+b
и c+d
параллельно. Теперь a+b
возвращается раньше, чем c+d
(как это может случиться, потому что это делается параллельно). Вместо ожидания возвращаемого значения c+d
теперь мы можем напрямую вычислить (a+b)+e
и затем добавить этот результат к результату c+d
. Итак, в итоге мы вычислили ((a+b)+e)+(c+d)
, что представляет собой перестановку a+b+c+d+e
.