Учитывая г ^ 2, существует ли эффективный способ вычисления г ^ 3? - PullRequest
13 голосов
/ 09 декабря 2011
double r2 = dx * dx + dy * dy;
double r3 = r2 * sqrt(r2);

Можно ли заменить вторую строку чем-то более быстрым?Что-то, что не включает sqrt?

Ответы [ 3 ]

14 голосов
/ 09 декабря 2011

Как насчет

double r3 = pow(r2,1.5);

Если sqrt реализован как особый случай pow, это сэкономит вам умножение.Не так уж много в общем плане вещей!

Если вы действительно ищете большую эффективность, подумайте, действительно ли вам нужен ^ ^ 3.Если, например, вы только тестируете его (или что-то полученное из него), чтобы увидеть, превышает ли он определенный порог, то вместо этого тестируйте r2, например

const double r3_threshold = 9;

//don't do this
if (r3 > r3_threshold)
    ....

//do do this
const double r2_threshold = pow(r3_threshold,2./3.); 
if (r2 > r2_threshold)
    ....

Таким образом pow будет вызываться только один раз, может быть, даже во время компиляции.

EDIT Если вам нужно каждый раз пересчитывать пороговое значение, я думаю, что ответ относительно Q_rsqrt стоит посмотреть и, вероятно, заслуживает опередить этот

12 голосов
/ 09 декабря 2011

Используйте быстрый обратный sqrt (используйте функцию Q_rsqrt).

У вас есть:

float r2;
// ... r2 gets a value
float invsqrt = Q_rsqrt(r2);
float r3 = r2*r2*invsqrt; // x*x/sqrt(x) = x*sqrt(x)

ПРИМЕЧАНИЕ: Для double типов существует константа, подобная 0x5f3759df, которая может помочь вам написать функцию, которая обрабатывает также double типы данных.

ПОСЛЕДНЕЕ РЕДАКТИРОВАНИЕ: Похоже, что метод уже обсуждался здесь .

ПОЗДНЕЕ РЕДАКТИРОВАНИЕ2: Константа для double была в википедии ссылка :

Ломонт указал, что "магическое число" для 64-битного размера IEEE754 тип double равен 0x5fe6ec85e7de30da, но на самом деле он близок к 0x5fe6eb50c7aa19f9.

1 голос
/ 09 декабря 2011

Я думаю, что другой способ взглянуть на ваш вопрос будет " как рассчитать (или приблизительный) sqrt (n) ". Оттуда ваш вопрос будет тривиальным (n * sqrt (n)). Конечно, вам придется определить, с какой ошибкой вы могли бы жить. Википедия дает вам много вариантов:

http://en.wikipedia.org/wiki/Methods_of_computing_square_roots

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...