Сплит аргумент квадратного корня алгебраически, может быть ?:
return sqrt((3*x*x+1)/2) * sqrt((6*y*y-5)/2);
Или разделить его дальше в зависимости от потребностей.
Если x
достаточно велик, вы можете игнорировать +1
и сделать первый термин:
sqrt((3*x*x)/2) = fabs(x) * sqrt(3.0/2.0)
и аналогично с y
на второй срок, что делает его
sqrt((6*y*y)/2) = fabs(y) * sqrt(3.0);
EDIT: После того, как OP отредактирован его вопрос будет следующим:
return sqrt(((3*x*x+1)*(6*y*y-5)-1)/4);
На самом деле вы можете разделить вещи. Вам просто нужно быть немного осторожнее. Суть в том, что если x
действительно большой, то +1
можно игнорировать. Если y
действительно большой, то -5
может быть проигнорирован. Если оба значения (3*x*x+1)
и (6*y*y-5)
являются положительными и либо действительно большими, то -1
можно игнорировать. Вы можете использовать эти советы и некоторую дополнительную окружную логику, чтобы немного покончить с этим. Например:
if(fabs(x) > BIGNUMBER && fabs(y) > BIGNUMBER)
{
return fabs(x) * fabs(y) * sqrt(18.0/4.0);
}
if(fabs(x) > BIGNUMBER && fabs(y) > 1.0) // x big and y term positive
{
return fabs(x) * sqrt(6*y*y-5) * sqrt(3.0/2.0);
}
if(fabs(y) > BIGNUMBER) // x term positive and y big
{
return sqrt(3*x*x+1) * fabs(y) * sqrt(6.0/2.0);
}
return sqrt(((3*x*x+1)*(6*y*y-5)-1)/4);
Вы можете оптимизировать это, но это только должно показать суть.
Насколько точны ответы, которые вам нужны? – templatetypedef
Переименуйте свою функцию ... это ужасно неочевидно, что она должна делать. И что сказал templatetypedef. – Brendan
@Brendan: Вам пришло в голову, что это может быть частью некоторого кода приличия, и что использование реального имени для 'f' может нарушить NDA OP? Например, «f» в порядке. –