Существует несколько возможных решений:
Очевидное:
double
aFunction( double* array, int index, double add )
{
double result = 1.0;
for ( int i = 0; i != 4; ++ i ) {
double tmp = array[i];
if ( i == index ) {
tmp += add;
}
result *= tmp * tmp;
}
return result;
}
Возможно быстрее (нет, если в цикле), но возможно с другими результатами:
double
aFunction( double* array, int index, double add )
{
double result = 1.0;
for ( int = 0; i != 4; ++ i ) {
result *= array[i] * array[i];
}
// Since we multiplied by array[i]^2, when we should
// have multipied by (array[i] + add)^2...
result *= 2 * array[index] * add + add * add;
return result;
}
Я сомневаюсь, стоит ли возиться с этим из-за массива из четырех элементов: четыре if
вероятно не дороже, чем окончательный дополнительный расчет.Однако для более длинных массивов, возможно, стоит подумать.
Наконец, больше для справки, поскольку это действительно некрасиво и работает только в однопоточной среде:
double
aFunction( double* array, int index, double add )
{
array[index] += add;
double result = 1.0;
for ( int i = 0; i != 4; ++ i ) {
result *= array[i] * array[i];
}
array[index] -= add;
return result;
}
В зависимости отфактическая оптимизация оборудования и компилятора, это может быть самым быстрым.(Но, опять же, только для четырех элементов это далеко не точно.)
Два других комментария, касающихся кода: если вы не собираетесь изменять array
, вам, вероятно, следует передать его как double const*
(что исключает последнюю возможность, указанную выше), и, поскольку все, что вы делаете, это читаете одно значение, на самом деле нет смысла передавать add
в качестве указателя;в моем коде выше я передал его по значению.