2015-12-12 3 views
0

У меня есть функция, определенная в заголовочном файле C, где массив m_parameters [] определяется в другом месте (только список номеров):Функция в файле заголовка

inline double Par3D::getValue(const double& x, const double& t) const { 
    double g1 = m_parameters[3] + m_parameters[4]*TMath::ATan(m_parameters[5]*(t-0.3)) ; 
    double g0 = m_parameters[0] + m_parameters[1]*TMath::ATan(m_parameters[2]*(t-0.3)) ; 
    return g0 + g1*TMath::ATan(m_parameters[6]*(x-0.3)) ; 
} 

Эта функция вызывается несколько раз в более крупная программа. Я получаю разные результаты, если я просто поставлю выражения для g0 и g1 непосредственно в аргументе return. Этого можно ожидать?

Большое спасибо.

+0

Можете ли вы включить набор выходных значений для двух случаев? – nnn

ответ

1

Этого можно ожидать. Стандарт C++ дает компилятору свободу оптимизировать по-разному, одним из которых является использование регистров с плавающей запятой в CPU для хранения промежуточных результатов, вместо того, чтобы использовать реальную память произвольного доступа для записи двойного. На каком-то оборудовании процесс записи обратно в double требует округления. Например, современные процессоры Intel имеют 80-битные регистры с плавающей запятой, но удваиваются в 64 бит в памяти. Таким образом, округление раньше может привести к разным результатам.

FWIW (не много) - если включить оптимизацию вы может найти регистр используется последовательно, в то время как без оптимизации компилятора могут последовать код наивности и вокруг переменной в памяти, как следует из использования местных переменные.

Смежные вопросы