Tengo un bucle de control ejecutándose a alta frecuencia y necesito calcular una raíz cuadrada en cada ciclo. Las funciones de raíz cuadrada típicas funcionan bien, pero toman un tiempo excesivo. Como el valor que tomo la raíz cuadrada de no cambia demasiado en cada ciclo, me gustaría encontrar una raíz cuadrada iterativa que converja y luego seguir el resultado correcto. De esta forma podría hacer una única iteración en cada paso de tiempo, en lugar de muchas.raíz cuadrada de seguimiento del valor móvil
El problema es que todos los métodos iterativos de raíz cuadrada que he visto probablemente fallarán cuando la entrada cambie. En particular, parece que habrá problemas cuando la entrada vaya a cero y luego aumente nuevamente; a los métodos no les gusta comenzar con una estimación de cero.
Mi rango de entrada es 0-4.5 y necesito una precisión de alrededor de 0.01, así que usar un incremento/decremento de 0.01 podría llevar demasiado tiempo - Quiero que converja principalmente en 10 ciclos o menos.
FYI Estoy usando un punto fijo de 16/32 bits, la entrada es de 16 bits q12. Está en un microcontrolador, así que no estoy interesado en usar 1K para una tabla de búsqueda. El código también se genera a partir de un modelo simulink y sus funciones de búsqueda de tablas están bastante llenas de sobrecarga.
¿Hay una buena solución para esto?
Un disparo del método de Halley (http://www.mathpath.org/Algor/squareroot/algor.square.root.halley.htm) debe hacer bien. Si quiere evitar la división, actualice 1/sqrt (x) en su lugar y use Newton o Halley. –
¿Qué quieres decir con que el valor cambia? ¿Estás diciendo que quieres encontrar 'sqrt (x + epsilon)' conociendo 'x' y' sqrt (x) 'sin tener que calcularlo directamente?¿O está diciendo que el registro que contiene x es volátil y puede cambiar a la mitad del cálculo (!?!)? –
Mira esta función 'FastSqrt' utilizada en los juegos http://www.gamedev.net/topic/278840-fast-sqrt/ – ja72