У меня очень ограниченные ресурсы, так как я работаю с микроконтроллером. Существует ли расширение ряда Тейлора, общая таблица поиска или рекурсивный подход?
Я бы предпочел сделать что-то без использования sqrt () из math.h
algorithms
c
numerical-algorithms
tarabyte
источник
источник
Ответы:
если вы хотите дешевое и грязное оптимизированное расширение степенных рядов (коэффициенты для рядов Тейлора сходятся медленно)
sqrt()
и множество других трансденталей, у меня есть некоторый код, созданный давно. Раньше я продавал этот код, но никто не платил мне за него почти десять лет. так что я думаю, что я выпущу это для общественного потребления. этот конкретный файл был для приложения, в котором процессор имел плавающую точку (IEEE-754 с одинарной точностью) и у них был компилятор C и система разработки, но они этого не сделалиимейте (или они не хотели связывать) stdlib, у которого были бы стандартные математические функции. им не нужна была совершенная точность, но они хотели, чтобы все было быстро. Вы можете довольно легко пересмотреть код, чтобы увидеть, каковы коэффициенты степенных рядов, и написать свой собственный код. этот код предполагает IEEE-754 и маскирует биты для мантиссы и экспоненты.Похоже, что «разметка кода», которую имеет SE, недружественна к угловым символам (вы знаете «>» или «<»), поэтому вам, вероятно, придется нажать «редактировать», чтобы увидеть все это.
источник
stdlib
в нем.Если вы еще не видели, «Квадратный корень Quake» просто загадочный. Он использует магию на уровне битов, чтобы дать вам очень хорошее первое приближение, а затем использует раунд или два приближения Ньютона для пересмотра. Это может помочь вам, если вы работаете с ограниченными ресурсами.
https://en.wikipedia.org/wiki/Fast_inverse_square_root
http://betterexplained.com/articles/understanding-quakes-fast-inverse-square-root/
источник
Тем не менее, есть предупреждение, которое мы должны учитывать при рассмотрении приведенного выше уравнения. Для квадратных корней решение должно быть положительным, поэтому для того, чтобы итерации (и результат) были положительными, должно выполняться следующее условие:
3 x n > ( x n ) 3 a ( x n ) 2 a < 3
Следовательно:
Поэтому, учитывая число, которое мы хотим вычислить для квадратного корня, исходное предположение должно удовлетворять вышеуказанному условию. Поскольку это в конечном итоге будет размещено на микроконтроллере, мы могли бы начать с любого значения (скажем, 1), затем продолжать цикл и уменьшать значение до тех пор, пока не будет выполнено вышеуказанное условие. Обратите внимание, что я избегал деления для прямого вычисления значениях 0 х 0 10 - 6x0 x0 x0 должно быть, так как деление это дорогая операция. Как только у нас будет первоначальное предположение, повторите метод Ньютона. Обратите внимание, что в зависимости от первоначального предположения может потребоваться более короткое или более длительное время для схождения. Все зависит от того, насколько вы близки к реальному ответу. Вы можете либо ограничить количество итераций, либо подождать, пока относительная разница между двумя корнями станет меньше некоторого порога (например, или около того).10−6
Поскольку ваш тег ищет алгоритм
C
, давайте напишем один очень быстро:Это довольно простая реализация метода Ньютона. Обратите внимание, что я продолжаю уменьшать первоначальное предположение вдвое, пока не будет выполнено условие, о котором мы говорили ранее. Я также пытаюсь найти квадратный корень из 5. Мы знаем, что это примерно равно 2,236 или около того. Использование приведенного выше кода дает следующий вывод:
Обратите внимание, что метод Ньютона находит решение взаимного решения, и мы умножаем на в конце, чтобы получить наш окончательный ответ. Также обратите внимание, что первоначальное предположение было изменено, чтобы обеспечить соответствие критериям, о которых я говорил выше. Просто для удовольствия, давайте попробуем найти квадратный корень из 9876.a
Как видите, отличается только то, сколько итераций требуется для вычисления квадратного корня. Чем больше число того, что вы хотите вычислить, тем больше итераций потребуется.
Я знаю, что этот метод уже был предложен в предыдущем посте, но я решил, что получу метод, а также предоставлю некоторый код!
источник
да, степенные ряды могут быстро и эффективно аппроксимировать функцию квадратного корня и только в ограниченной области. чем шире домен, тем больше терминов вам понадобится в ваших степенных рядах, чтобы ошибка оставалась достаточно низкой.
где
если это с плавающей запятой, вам нужно разделить экспоненту и мантиссу, как это делает мой C-код в другом ответе.
источник
На самом деле это делается путем решения квадратного уравнения с использованием метода Ньютона:
http://en.wikipedia.org/wiki/Methods_of_computing_square_roots
Для чисел больше единицы вы можете использовать следующее расширение Тейлора:
http://planetmath.org/taylorexpansionofsqrt1x
источник
С точностью до 4%, если я хорошо помню. Он использовался инженерами, до логарифмических линейок и калькуляторов. Я узнал об этом в « Записках и формулах», De Laharpe , 1923
источник