![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Comparison of Nth-root Finding AlgorithmsBoost , Math Toolkit 2.5.0 , Comparison of Root Finding Algorithms
|
Функция |
Запрошенная точность |
---|---|
TOMS748 |
numeric_limits |
Ньютон |
этаж (число_лимиты |
Галлей |
этаж (число_лимиты |
Schröder |
этаж (число_лимиты |
В тестах использовались Microsoft Visual Studio 2013 (Update 1) и GCC 4.9.1 с использованием исходного кодаroot_n_finding_algorithms.cpp.
Неопределенность времени (особенно при использовании MSVC) составляет не менее 5% от нормированного времени.
Чтобы выбрать «лучшие» и «худшие» алгоритмы выделены синим и красным цветом. Более чем один результат может быть «лучшим», когда нормализованные времена неразличимы в пределах неопределенности.
Фракция полной точности 1
Table 12.3. 5th root(28) for float, double, long double and cpp_bin_float_50 types, using _X86_SSE2
плавать |
двойной |
длинный |
pp50 |
|||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Алго |
Его |
Время |
Norm |
Дис |
Его |
Время |
Norm |
Дис |
Его |
Время |
Norm |
Дис |
Его |
Время |
Norm |
Дис |
||||
TOMS748 |
7 |
320 |
1.53 |
0 |
11 |
576 |
2.61 |
1 |
11 |
557 |
2.48 |
1 |
12 |
119843 |
7.52 |
0 |
||||
Ньютон |
3 |
209 |
1.00 |
0 |
4 |
221 |
1.00 |
-1 |
4 |
225 |
1.00 |
-1 |
6 |
15937 |
1.00 |
0 |
||||
Галлей |
2 |
214 |
1.02 |
0 |
3 |
256 |
1.16 |
0 |
3 |
243 |
1.08 |
0 |
4 |
28437 |
1.78 |
0 |
||||
Schröder |
2 |
218 |
1.04 |
0 |
3 |
245 |
1.11 |
-1 |
3 |
245 |
1.09 |
-1 |
4 |
35625 |
2.24 |
0 |
Table 12.4. 7th root(28) for float, double, long double and cpp_bin_float_50 types, using _X86_SSE2
плавать |
двойной |
длинный |
pp50 |
|||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Алго |
Его |
Время |
Norm |
Дис |
Его |
Время |
Norm |
Дис |
Его |
Время |
Norm |
Дис |
Его |
Время |
Norm |
Дис |
||||
TOMS748 |
12 |
493 |
2.18 |
1 |
15 |
762 |
3.05 |
2 |
15 |
765 |
3.08 |
2 |
14 |
157343 |
7.09 |
0 |
||||
Ньютон |
5 |
226 |
1.00 |
0 |
6 |
250 |
1.00 |
0 |
6 |
248 |
1.00 |
0 |
8 |
22187 |
1.00 |
0 |
||||
Галлей |
4 |
257 |
1.14 |
0 |
5 |
293 |
1.17 |
0 |
5 |
293 |
1.18 |
0 |
6 |
44062 |
1.99 |
0 |
||||
Schröder |
5 |
285 |
1.26 |
0 |
6 |
317 |
1.27 |
0 |
6 |
317 |
1.28 |
0 |
7 |
61406 |
2.77 |
0 |
Table 12.5. 11th root(28) for float, double, long double and cpp_bin_float_50 types, using _X86_SSE2
плавать |
двойной |
длинный |
pp50 |
|||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Алго |
Его |
Время |
Norm |
Дис |
Его |
Время |
Norm |
Дис |
Его |
Время |
Norm |
Дис |
Его |
Время |
Norm |
Дис |
||||
TOMS748 |
12 |
556 |
2.24 |
-2 |
14 |
784 |
2,94 |
2 |
14 |
793 |
2,94 |
2 |
17 |
235781 |
8.88 |
2 |
||||
Ньютон |
6 |
248 |
1.00 |
0 |
7 |
267 |
1.00 |
0 |
7 |
270 |
1.00 |
0 |
9 |
26562 |
1.00 |
0 |
||||
Галлей |
4 |
254 |
1.02 |
-1 |
5 |
290 |
1.09 |
0 |
5 |
293 |
1.09 |
0 |
6 |
46406 |
1,75 |
0 |
||||
Schröder |
6 |
312 |
1.26 |
0 |
7 |
351 |
1.31 |
0 |
7 |
356 |
1.32 |
0 |
8 |
76250 |
2.87 |
0 |
Фракция полной точности 1
Table 12.6. 5th root(28) for float, double, long double and cpp_bin_float_50 types, using _X64_AVX
плавать |
двойной |
длинный |
pp50 |
|||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Алго |
Его |
Время |
Norm |
Дис |
Его |
Время |
Norm |
Дис |
Его |
Время |
Norm |
Дис |
Его |
Время |
Norm |
Дис |
||||
TOMS748 |
7 |
239 |
1.50 |
0 |
11 |
451 |
2.53 |
1 |
11 |
439 |
2.49 |
1 |
12 |
90312 |
7.51 |
0 |
||||
Ньютон |
3 |
159 |
1.00 |
0 |
4 |
178 |
1.00 |
-1 |
4 |
176 |
1.00 |
-1 |
6 |
12031 |
1.00 |
0 |
||||
Галлей |
2 |
168 |
1.06 |
0 |
3 |
203 |
1.14 |
0 |
3 |
198 |
1.13 |
0 |
4 |
20937 |
1.74 |
0 |
||||
Schröder |
2 |
173 |
1.09 |
0 |
3 |
206 |
1.16 |
-1 |
3 |
203 |
1.15 |
-1 |
4 |
26250 |
2.18 |
0 |
Table 12.7. 7th root(28) for float, double, long double and cpp_bin_float_50 types, using _X64_AVX
плавать |
двойной |
длинный |
pp50 |
|||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Алго |
Его |
Время |
Norm |
Дис |
Его |
Время |
Norm |
Дис |
Его |
Время |
Norm |
Дис |
Его |
Время |
Norm |
Дис |
||||
TOMS748 |
12 |
385 |
2.19 |
1 |
15 |
635 |
3.13 |
2 |
15 |
621 |
3.17 |
2 |
14 |
114843 |
6.81 |
0 |
||||
Ньютон |
5 |
176 |
1.00 |
0 |
6 |
203 |
1.00 |
0 |
6 |
196 |
1.00 |
0 |
8 |
16875 |
1.00 |
0 |
||||
Галлей |
4 |
209 |
1.19 |
0 |
5 |
254 |
1.25 |
0 |
5 |
246 |
1.26 |
0 |
6 |
32343 |
1,92 |
0 |
||||
Schröder |
5 |
223 |
1.27 |
0 |
6 |
273 |
1.34 |
0 |
6 |
275 |
1.40 |
0 |
7 |
45156 |
2.68 |
0 |
Table 12.8. 11th root(28) for float, double, long double and cpp_bin_float_50 types, using _X64_AVX
плавать |
двойной |
длинный |
pp50 |
|||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Алго |
Его |
Время |
Norm |
Дис |
Его |
Время |
Norm |
Дис |
Его |
Время |
Norm |
Дис |
Его |
Время |
Norm |
Дис |
||||
TOMS748 |
12 |
467 |
2,42 |
-2 |
14 |
648 |
3.06 |
2 |
14 |
640 |
2.99 |
2 |
17 |
170000 |
8,85 |
2 |
||||
Ньютон |
6 |
193 |
1.00 |
0 |
7 |
212 |
1.00 |
0 |
7 |
214 |
1.00 |
0 |
9 |
19218 |
1.00 |
0 |
||||
Галлей |
4 |
209 |
1.08 |
-1 |
5 |
256 |
1.21 |
0 |
5 |
250 |
1.17 |
0 |
6 |
32656 |
1,70 |
0 |
||||
Schröder |
6 |
248 |
1.28 |
0 |
7 |
306 |
1.44 |
0 |
7 |
298 |
1.39 |
0 |
8 |
53437 |
2.78 |
0 |
Фракция полной точности 1
Table 12.9. 5th root(28) for float, double, long double and cpp_bin_float_50 types, using _X64_SSE2
плавать |
двойной |
длинный |
pp50 |
|||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Алго |
Его |
Время |
Norm |
Дис |
Его |
Время |
Norm |
Дис |
Его |
Время |
Norm |
Дис |
Его |
Время |
Norm |
Дис |
||||
TOMS748 |
7 |
193 |
2.14 |
0 |
11 |
432 |
3.86 |
1 |
9 |
579 |
3,83 |
0 |
12 |
59062 |
7.56 |
0 |
||||
Ньютон |
3 |
90 |
1.00 |
0 |
4 |
112 |
1.00 |
-1 |
5 |
151 |
1.00 |
0 |
6 |
7812 |
1.00 |
0 |
||||
Галлей |
2 |
98 |
1.09 |
0 |
3 |
135 |
1.21 |
0 |
3 |
201 |
1.33 |
0 |
4 |
13750 |
1.76 |
0 |
||||
Schröder |
2 |
112 |
1.24 |
0 |
3 |
142 |
1.27 |
-1 |
3 |
206 |
1.36 |
0 |
4 |
17031 |
2.18 |
0 |
Table 12.10. 7th root(28) for float, double, long double and cpp_bin_float_50 types, using _X64_SSE2
плавать |
двойной |
длинный |
pp50 |
|||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Алго |
Его |
Время |
Norm |
Дис |
Его |
Время |
Norm |
Дис |
Его |
Время |
Norm |
Дис |
Его |
Время |
Norm |
Дис |
||||
TOMS748 |
12 |
351 |
1.97 |
1 |
15 |
621 |
3.18 |
2 |
13 |
906 |
3.61 |
0 |
14 |
75468 |
7.10 |
0 |
||||
Ньютон |
5 |
178 |
1.00 |
0 |
6 |
195 |
1.00 |
0 |
7 |
251 |
1.00 |
0 |
8 |
10625 |
1.00 |
0 |
||||
Галлей |
4 |
196 |
1.10 |
0 |
5 |
242 |
1.24 |
0 |
5 |
345 |
1.37 |
0 |
6 |
21093 |
1.99 |
0 |
||||
Schröder |
5 |
225 |
1.26 |
0 |
6 |
270 |
1.38 |
0 |
6 |
384 |
1.53 |
0 |
7 |
29062 |
2,74 |
0 |
Table 12.11. 11th root(28) for float, double, long double and cpp_bin_float_50 types, using _X64_SSE2
плавать |
двойной |
длинный |
pp50 |
|||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Алго |
Его |
Время |
Norm |
Дис |
Его |
Время |
Norm |
Дис |
Его |
Время |
Norm |
Дис |
Его |
Время |
Norm |
Дис |
||||
TOMS748 |
12 |
429 |
2.22 |
-2 |
14 |
679 |
3.02 |
2 |
14 |
1098 |
3.94 |
1 |
17 |
114531 |
8.83 |
2 |
||||
Ньютон |
6 |
193 |
1.00 |
0 |
7 |
225 |
1.00 |
0 |
7 |
279 |
1.00 |
0 |
9 |
12968 |
1.00 |
0 |
||||
Галлей |
4 |
196 |
1.02 |
-1 |
5 |
248 |
1.10 |
0 |
5 |
348 |
1.25 |
0 |
6 |
21718 |
1.67 |
0 |
||||
Schröder |
6 |
254 |
1.32 |
0 |
7 |
323 |
1.44 |
0 |
7 |
453 |
1.62 |
0 |
8 |
35625 |
2,75 |
0 |
Из этого ограниченного упражнения можно сделать некоторые предварительные выводы.
double
>.double
>позволяет сходимость к конечному точному результату в одной или двух итерациях. Поэтому в этом надуманном примере, грубо разделив показатель на N для «угадывания», было бы гораздо лучше использовать функцию<pow<double>
>или, если точнее,<pow<longdouble>
>для оценки «угадывания». Ограничение этой тактики состоит в том, что диапазон возможных (экспонентных) значений может быть меньше многоточного типа.Очевидно, что ваш пробегбудет варьироваться, но в целомитерация Ньютона-Рафсонакажется первым выбором алгоритма и попыткой найти хорошую «угадку» первой цели ускорения, особенно дляBoost.Multiprecision. И, конечно же, оптимизация компилятора имеет решающее значение для скорости.
Статья Comparison of Nth-root Finding Algorithms раздела Math Toolkit 2.5.0 Comparison of Root Finding Algorithms может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Comparison of Root Finding Algorithms ::
реклама |