Могу ли я гарантировать, что компилятор C ++ не изменит порядок моих вычислений?

В настоящее время я читаю отличную Библиотеку для арифметики двойных-двойных и четверных-двойных бумаги, и в первых нескольких строках я замечаю, что они вычисляют сумму следующим образом:

std::pair TwoSum(double a, double b)
{
    double s = a + b;
    double v = s - a;
    double e = (a - (s - v)) + (b - v);
    return std::make_pair(s, e);
}

Вычисление ошибки, e , основывается на том факте, что вычисление следует этому порядку операций именно потому, что неассоциативных свойств математики с плавающей запятой IEEE-754.

Если я скомпилирую это в современном оптимизирующем компиляторе C ++ (например, MSVC или gcc), могу ли я быть уверен, что компилятор не оптимизирует способ выполнения этого вычисления?

Во-вторых, гарантируется ли это где-нибудь в пределах Стандарт C ++?

7
задан Mike Bailey 5 October 2011 в 20:13
поделиться