La implementación de funciones matemáticas para varias cosas es bastante simple. int mul(int,int);
, int pow(int,int);
, incluso double div(float,float);
son fáciles de hacer y se pueden implementar con bucles o recursión. (Estos son los mismos métodos que se utilizan para realizar estas funciones a mano o en la cabeza). Para multiplicar, simplemente agregue el número repetidamente. Para dividir, restarlo repetidamente. Para obtener el poder, multiplícate repetidamente. Y así.Implementación de la función de cálculo de raíz
Sin embargo, una función matemática que siempre me he preguntado son las raíces. Por ejemplo, ¿cómo escribirías una función para calcular la raíz cuadrada (o cubo, etc.) de un número (es decir, double root(float num, float root);
)? Traté de mirar alrededor y no pude encontrar un algoritmo o método para hacerlo.
Cuando trato de calcular una raíz a mano, generalmente utilizo el método de adivinar (comience con un número aproximado, agregue una fracción, multiplique, vea qué tan lejos está, agregue una fracción más pequeña, multiplique, vuelva a verificar, y repite hasta que esté satisfecho). Supongo que podría funcionar, pero seguramente hay un método mejor y más rápido (independientemente de la velocidad con la que una computadora pueda hacerlo).
Obviamente, las LUT no son relevantes ya que tendrían que ser lo suficientemente genéricas como para tomar cualquier operando (a menos que esté escribiendo un juego con un conjunto finito de datos). El Wikipedia article menciona el método de suposición y enumera algunos antiguos (desde mucho antes de que se inventaran las computadoras), así como algunos métodos matemáticos puros e incluso de cálculo (incluidos algunos que tienen como componente el "infinito"). Los únicos que parecen tener algo que ver con la electrónica usan trucos o logiritmos. (Y eso es solo para square-roots, y mucho menos cube-roots, etc.)
¿No hay un método de cálculo de raíz fácil? ¿Cómo lo hacen las calculadoras? ¿Cómo lo hacen las computadoras? (No, simplemente haciendo double pow(a,0.5);
no funcionará porque entonces ¿cómo se implementaría double pow(float,float)
?)
¿Acabo de agrupar incorrectamente funciones de raíz con funciones más simples? ¿Son más complejos de lo que parecen?
Sí, no multiplique ni divida por adiciones repetidas. Esto es bastante polvoriento, pero http://moneybender.com/transactor_article.pdf. –