![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Comparison of Cube Root Finding AlgorithmsBoost , Math Toolkit 2.5.0 , Comparison of Root Finding Algorithms
|
Функция |
Запрошенная точность |
---|---|
TOMS748 |
numeric_limits |
Ньютон |
этаж (число_лимиты |
Галлей |
этаж (число_лимиты |
Schröder |
этаж (число_лимиты |
std::cbrt
появился в несколько раз быстрее, чем более общий boost::math::cbrt, на других платформах/компиляторах boost::cbrt
заметно быстрее. В целом, результаты сильно зависят от используемых вариантов компилятора выбора архитектуры кода/процессора. Можно предположить, что стандартная библиотека будет компилироваться с опциями почти , оптимальными для платформы, на которой она была установлена, где у пользователя больше выбора по сравнению с опциями, используемыми для Boost. Математика. Выберите что-то слишком общее / консервативное, и производительность пострадает, в то же время выбирая опции, которые используют новейший набор команд, заметно увеличивают скорость.
boost::math::cbrt
позволяет использовать с любым типом плавающей точки, определенным пользователем, удобно Boost.Multiprecision. Он также может воспользоваться некоторым преимуществом хорошего поведения функции куба по сравнению с более общей реализацией в n-ых примерах поиска корней. Например, он использует полиномиальное приближение, чтобы генерировать лучшее предположение, чем деление экспоненты на три, и может избежать сложных проверок в итерации Ньютона-Рафсона , необходимых для предотвращения резкого отклонения поиска. Для известной точности также может быть возможно зафиксировать количество итераций, позволяя вставлять и разворачивать петлю. Он также алгебраически упрощает шаги Галлея, что приводит к значительному сокращению количества операций с плавающей запятой по сравнению с реализацией «черного ящика», которая вычисляет производные отдельно, а затем объединяет их в коде Галлея. Как правило, было обнаружено, что вычисления с использованием типа double
занимали в несколько раз больше времени при использовании различных алгоритмов непосредственного поиска корней, а не ручного кодирования / оптимизации cbrt
.cpp_bin_float_50
, для точности 50 десятичных цифр заняло гораздо больше времени, как и ожидалось, потому что большинство вычислений использует программное обеспечение, а не 64-битное оборудование с плавающей запятой. Скорость часто более чем в 50 раз медленнее.cpp_bin_float_50
, TOMS Алгоритм 748: включение нулей непрерывных функций было намного медленнее, показывая преимущество использования производных. Итерация Ньютона-Рафсона оказалась в два раза быстрее, чем любой из методов второго производного: это крайний случай, хотя функция и ее производные настолько дешевы для вычислений, что мы действительно измеряем сложность кода поиска корней.Table 12.1. Cube root(28) for float, double, long double and cpp_bin_float_50
плавать |
двойной |
длинный |
pp50 |
|||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Алгоритм |
Его |
Время |
Norm |
Дис |
Его |
Время |
Norm |
Дис |
Его |
Время |
Norm |
Дис |
Его |
Время |
Norm |
Дис |
||||
cbrt |
0 |
46875 |
1.0 |
0 |
0 |
46875 |
1.0 |
1 |
0 |
46875 |
1.0 |
1 |
0 |
4906250 |
1.1 |
0 |
||||
TOMS748 |
8 |
234375 |
5.0 |
-1 |
11 |
437500 |
9.3 |
2 |
11 |
437500 |
9.3 |
2 |
7 |
66218750 |
15. |
-2 |
||||
Ньютон |
5 |
109375 |
2.3 |
0 |
6 |
125000 |
2.7 |
0 |
6 |
140625 |
3.0 |
0 |
2 |
4531250 |
1.0 |
0 |
||||
Галлей |
3 |
125000 |
2.7 |
0 |
4 |
156250 |
3.3 |
0 |
4 |
156250 |
3.3 |
0 |
2 |
10625000 |
2.3 |
0 |
||||
Schröder |
4 |
140625 |
3.0 |
0 |
5 |
187500 |
4.0 |
0 |
5 |
203125 |
4.3 |
0 |
2 |
13109375 |
2.9 |
0 |
Table 12.2. Cube root(28) for float, double, long double and cpp_bin_float_50
плавать |
двойной |
длинный |
pp50 |
|||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Алгоритм |
Его |
Время |
Norm |
Дис |
Его |
Время |
Norm |
Дис |
Его |
Время |
Norm |
Дис |
Его |
Время |
Norm |
Дис |
||||
cbrt |
0 |
46875 |
1.0 |
0 |
0 |
46875 |
1.0 |
0 |
0 |
46875 |
1.0 |
0 |
0 |
3500000 |
1.1 |
0 |
||||
TOMS748 |
8 |
187500 |
4.0 |
-1 |
11 |
406250 |
8.7 |
2 |
10 |
609375 |
13. |
-1 |
7 |
44531250 |
14. |
-2 |
||||
Ньютон |
5 |
93750 |
2.0 |
0 |
6 |
109375 |
2.3 |
0 |
6 |
171875 |
3.7 |
0 |
2 |
3140625 |
1.0 |
-1 |
||||
Галлей |
3 |
93750 |
2.0 |
0 |
4 |
125000 |
2.7 |
0 |
4 |
218750 |
4.7 |
0 |
2 |
7171875 |
2.3 |
0 |
||||
Schröder |
4 |
109375 |
2.3 |
0 |
5 |
171875 |
3.7 |
0 |
5 |
281250 |
6.0 |
0 |
2 |
8703125 |
2.8 |
0 |
Статья Comparison of Cube Root Finding Algorithms раздела Math Toolkit 2.5.0 Comparison of Root Finding Algorithms может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Comparison of Root Finding Algorithms ::
реклама |