Search
Write a publication
Pull to refresh

Comments 37

Глянул по диагонали - да, это очень близко к теме статьи, и что то интересное про полиномы Чебышева

Если зафиксировать X0, то n-ый член последовательности

X_{i+1}=X_i(2-DX_i)

можно выразить как полином степени 2^n-1 по D, причем из свойств метода Ньютона получаем, что на отрезке [1.0, 2.0] его максимальное отклонение от 1/x очень маленькое. Можем ли мы найти какой-то другой полином, который можно было бы быстрее посчитать, и его отклонение было бы не хуже? Вот со вторым свойством как раз всплывают многочлены Чебышева, и основанный на нем метод Ремеза (про них не так давно была на хабре статья про вычисление синуса) -- такие методы позволяют найти многочлен фиксированной степени с наименьшим отклонением от целевой функции на отрезке. Как этот многочлен потом эффективно вычислять -- отдельный вопрос, вроде как в статье об этом отдельный параграф.

Статья, на которую вы ссылатесь, - хорошая. Жалко, что самое интересное - как они получили эти значения коэффециентов, там не описано толком, просто ссылка на этот алгоритм Ремеза. Ну ладно, может покопаюсь ещё.

Можно было до публикации принять к сведению вот это:

https://habr.com/ru/articles/830040/

Спойлер: там есть раздел "Кто виноват — ясно, а делать-то что?"

Можете пояснить, что хотели сказать? Что вовсе не обязательно грамотно писать статьи? Это сложно?

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

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

Правильно пишется: в "4-м". После "по сути" не хватает запятой. В конце предложения ставится точка.

Хотя, для uint16_t он является избыточным для более широких типов uint32_t, uint64_t полная таблица дробей будет заниматься неоправданно много

После "избыточным" не хватает запятой. И чем таблица будет заниматься?

Я знаю, что Вы мне можете написать: мы не экзамене по русскому языку и т.д. Дело Ваше.

Ага, больше я это обсуждать не собираюсь - считайте, что у меня авторская пунктуация во всех предложениях

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

Исправлять ошибки должны комментаторы, а не автор?

Говорят, прогнать текст через автокорректор - это просто. Хотя бы через Microsoft Word, там можно нажать F7. Работает, начиная с MS Office 97.

Пунктуацию он вам толком не исправит

Тут другой вопрос: если вам так всё не нравится зачем это читать, и ещё и комментировать ?

Процитируйте место, по которому Вы решили, что мне всё не нравится.

выходит уныло - предлагаю пойти поругаться куда-то исчо

Очень интересно! Мы делали так - перемножали два быстрых обратных корня - тоже неплохо получалось.

типа формула

А сами множители считаются методом Ньютона?

Примерно да...
ru.wikipedia.org/wiki/Быстрый_обратный_квадратный_корень
https://habr.com/ru/articles/730872/
https://habr.com/ru/companies/infopulse/articles/336110/

Главное помнить, что быстрый обратный корень выдает аппроксимацию, а не точное значение.

На самом деле точное значение для деления это вещь такая...часто её нет и быть не может, например, 1/3 в десятичностой системе, а в двоичной системе все дроби вида 1/n где n - не степень двойки не имеют такого представления. Можно посмотреть мою предыдщую статью, там весь алгоритм построен на том, как аккуратно обращаться с погрешностями. Да и в этой статье, конечно, этот вопрос затронут тоже.

Хотя, для uint16_t он является избыточным для более широких типов uint32_t, uint64_t полная таблица дробей будет заниматься неоправданно много памяти, а значит, реализация и применения метода касательных будет иметь смысл.

Если использовать этот метод для uint64_t, то как его производительность будет соотноситься со встроенной операцией деления?

Невозможно ответить на этот вопрос, не проведя экспериментов. Скорее всего результат будет неплохой - храним все значения для uit16_t , делаем два шага алгоритма , шаг коррекции

Почему нельзя использовать тот же самый метод - использовать те же самые 3 бита для приближения, но увеличить количество итераций, чтобы получить точность уже 64 бита?

Так можно - но каждая итерация же делает метод медленнее

Так в этом и был мой вопрос - насколько медленнее получится, если попробовать делить этим методом длинные числа.

Не буду повторяться с ответом, тут нужно учесть, что уже на uint32_t померить все комбинации - как я мерю в статье - будет долго, либо нужно раскидывать по потокам желательно на какой-то мощной машине, либо брать не все комбинации

Не привожу исходный код измерений для метода divide, потому что он отличается только одной строкой, средний результат: 5.8 секунды — лучше! Причём — значительно!

Удивительно, как компилятор умеет векторизовать такой код, с поиском по таблице и проверками остатка, что он оказывается быстрее стандартного деления (в SIMD ведь нет целочисленного деления? но я удивлюсь, если приведённый вами код окажется быстрее, чем реализация такого типа с делением в вещественных числах)

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

Sign up to leave a comment.