2013-02-27 2 views
5

Моя программа использует Math.pow() для вычисления относительно большого двойного числа в степени 2. Позже мне нужно найти квадратный корень из очень большого двойника номер. Проблема в том, что я должен делать это более 100 000 раз, и это занимает очень много времени. Есть ли альтернатива, которая может ускорить этот процесс? СпасибоJava - более быстрая альтернатива Math.pow() и Math.sqrt()

Редактировать: Большие числа Я имею в виду от 1000 до 10000 (возможно, не так много в вычислительных терминах). И в терминах этого требуется много времени, для выполнения этой функции требуется около 30 секунд.

+0

вам нужно сделать эту же операцию для 100 000 уникальных номеров? – Brad

+5

Можете ли вы определить «относительно большой», «очень большой» и «очень длинный»? – asteri

+0

http://stackoverflow.com/questions/7902418/the-best-alternative-of-math-pow-in-j2me – Brad

ответ

7

Вы вряд ли найдете лучшую (быструю) реализацию, чем Java Math. У вас может быть больше удачи, пытаясь изменить способ выполнения вычислений в вашем алгоритме. Например, есть ли способ избежать квадратного корня из огромного числа?

Если это не сработает, вы можете попробовать его реализовать на более подходящем языке, предназначенном для быстрых математических вычислений (что-то вроде Matlab).

В противном случае вы можете попытаться оптимизировать это в других областях. Возможно, вы можете попытаться кэшировать прошлые результаты, если они будут полезны позже.

+0

Ну, это включает формулу евклидовой дистанции, поэтому я не могу ее избежать – Matt9Atkins

+0

@ Matt9Atkins вам действительно нужно эвклидовое расстояние? Вы можете использовать свой квадрат для сравнения ... –

+0

Ну, есть еще варианты для ускорения этого. Вам нужно фактическое расстояние, или вы просто сравниваете их? Если вы просто сравниваете их, вы можете избежать квадратной корневой части. – Oleksi

8

«Сила 2» возвышается. Вы бы лучше сделали это, умножив число самостоятельно.

Версия библиотеки sqrt, вероятно, быстрее, чем все, что вы могли бы выкопать в другом месте. Если вы вызываете подпрограмму C, вы просто добавляете накладные расходы из межязыкового вызова. Но вам нужны точные квадратные корни, или же поиск в таблице приближений? Повторяются ли значения, т. Е. Вам часто приходится вычислять корни одинаковых чисел? Если это так, кеширование квадратных корней в HashMap может быть быстрее, чем их вычисление.

1

Ну, ваша проблема с силой 2 может быть просто выполнена путем умножения числа на себя. Например, предположим, что переменная а номер, который вы хотите поднять до 2. Это то же самое, как: int a=5; int b=a*a;

0

Вы можете использовать х * х вместо Pow (х, 2).

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

Возможно, вы найдете лучшее, например Newton's method (по уравнению sqrt (N) -x = 0).

Это также зависит от необходимой точности, вы можете торговать точностью и временем.

Вы также можете сохранить результаты, чтобы избежать множества вычислений в тех же самых записях.

+0

Уверен, вы имеете в виду, что вы можете использовать 'x * x' вместо' pow (x, 2) '. И да, конечно, лучше рассчитать его как x * x. – NovaDenizen

+0

правый, фиксированный ... – fso

1

Единственное, что я могу придумать, это сохранить результаты для скорости, квадратный корень не изменится, а ~ 9000 сохраненных номеров не так много. Вероятно, вам удастся создать ваши данные, чтобы вы могли оптимально найти подходящий результат.

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