Tengo recursos muy limitados ya que estoy trabajando con un microcontrolador. ¿Existe una expansión de la serie taylor, una tabla de búsqueda común o un enfoque recursivo?
Prefiero hacer algo sin usar math.h sqrt ()
algorithms
c
numerical-algorithms
tarabyte
fuente
fuente
Respuestas:
si desea una expansión de la serie de potencia optimizada barata y sucia (los coeficientes de la serie de Taylor convergen lentamente) para
sqrt()
y un montón de otros trancendentals, tengo algún código de hace mucho tiempo. Solía vender este código, pero nadie me lo ha pagado por casi una década. así que creo que lo lanzaré para consumo público. Este archivo en particular era para una aplicación donde el procesador tenía coma flotante (precisión única IEEE-754) y tenían un compilador C y un sistema de desarrollo, pero no teníantener (o no querían vincular) el stdlib que habría tenido las funciones matemáticas estándar. no necesitaban una precisión perfecta, pero querían que las cosas fueran rápidas. puede hacer ingeniería inversa del código con bastante facilidad para ver cuáles son los coeficientes de la serie de potencia y escribir su propio código. este código asume IEEE-754 y enmascara los bits para mantisa y exponente.parece que el "marcado de código" que tiene SE no es amigable con los caracteres angulares (ya sabes ">" o "<"), por lo que probablemente tendrás que presionar "editar" para verlo todo.
fuente
stdlib
.Si no lo ha visto, la "raíz cuadrada de Quake" es simplemente desconcertante. Utiliza algo de magia a nivel de bits para darte una muy buena primera aproximación, y luego usa una ronda o dos de aproximación de Newton para revisar. Podría ayudarlo si está trabajando con recursos limitados.
https://en.wikipedia.org/wiki/Fast_inverse_square_root
http://betterexplained.com/articles/understanding-quakes-fast-inverse-square-root/
fuente
Sin embargo, hay una advertencia que debemos tener en cuenta al mirar la ecuación anterior. Para las raíces cuadradas, la solución debe ser positiva y, por lo tanto, para que las iteraciones (y el resultado) sean positivas, se debe cumplir la siguiente condición:
Por lo tanto:
Como su etiqueta está buscando un algoritmo
C
, escribamos uno muy rápidamente:Esta es una implementación bastante básica del método de Newton. Tenga en cuenta que sigo disminuyendo la suposición inicial a la mitad hasta que se cumpla la condición de la que hablamos anteriormente. También estoy tratando de encontrar la raíz cuadrada de 5. Sabemos que esto es aproximadamente igual a 2.236 más o menos. El uso del código anterior da el siguiente resultado:
Como puede ver, lo único que es diferente es cuántas iteraciones se requieren para calcular la raíz cuadrada. Cuanto mayor sea el número de lo que desea calcular, más iteraciones tomará.
Sé que este método ya se sugirió en una publicación anterior, ¡pero pensé que derivaría el método y proporcionaría un código!
fuente
Sí, una serie de potencia puede aproximar de manera rápida y eficiente la función de raíz cuadrada, y solo en un dominio limitado. cuanto más amplio sea el dominio, más términos necesitará en su serie de potencia para mantener el error lo suficientemente bajo.
dónde
si es punto flotante, debe separar el exponente y la mantisa como lo hace mi código C en la otra respuesta.
fuente
En realidad, se hace resolviendo una ecuación cuadrática usando el Método Newton:
http://en.wikipedia.org/wiki/Methods_of_computing_square_roots
Para números mayores que uno, puede usar la siguiente expansión de Taylor:
http://planetmath.org/taylorexpansionofsqrt1x
fuente
Dentro del 4% de precisión, si no recuerdo mal. Fue utilizado por ingenieros, antes de reglas y calculadoras logarítmicas. Lo aprendí en Notes et formules de l'ingénieur, De Laharpe , 1923.
fuente