Esta es una especie de pregunta cruzada de procesamiento de señales/programación/matemáticas. En este momento me parece que está más relacionada con las matemáticas, pero si los moderadores consideran que pertenece a otro lugar, por favor, siéntanse libres de migrarla.
Estoy trabajando en un proyecto en el que tengo una potencia de cálculo limitada y necesito hacer una aproximación rápida de la función tangente hiperbólica sobre un rango bastante grande de argumentos de entrada. Suponiendo que los números se almacenan en punto fijo con una parte fraccionaria de 8 bits entonces la aproximación a $\tanh(x)$ debe trabajar hasta el límite que implica la resolución, o para los argumentos $\tanh^{-1}(\pm[1 - \frac{1}{2^8}]) \approx \pm3.1$ . Sé que las series de Taylor no convergen lo suficientemente rápido en este rango, y no lo he investigado a fondo, pero tampoco creo que una aproximación polinómica de Chebyshev converja lo suficientemente rápido. Por diversas razones tampoco es posible una búsqueda en la tabla.
$\tanh(x)$ es algebraicamente equivalente a $\mathrm{sgn}(x)(1 - \frac{2}{e^{2|x|} + 1})$ . Esto parece prometedor; una expansión en serie de $e^x$ converge mejor que $\tanh(x)$ . Para un cálculo numérico rápido en un hardware limitado, el "+ 1" en el denominador es un obstáculo, ya que significa que hay que realizar una división, y como muchos procesadores sencillos no tienen "división por hardware", la división tiene que hacerse por software mediante repetidos desplazamientos y sustracciones, lo que es terriblemente lento.
Para evitar esto estoy considerando el siguiente enfoque. En lugar de utilizar $\mathrm{sgn}(x)(1 - \frac{2}{e^{2|x|} + 1})$ para representar exactamente tanh(x), defina el siguiente tipo de función similar: $\mathrm{sgn}(x)A(1 - e^{-B|x|})$ para las constantes desconocidas A y B. A continuación, defina una función de pérdida:
$f(x) = \int_0^{3.1}[\tanh(x) - A(1 - e^{-Bx})]^2dx$
A continuación, utilice un método numérico (¿descenso de gradiente?) para encontrar los valores de A y B que minimizan la pérdida. El problema de la aproximación $\tanh(x)$ rápidamente se convierte en una aproximación $e^{-x}$ rápidamente más una resta y una multiplicación extra.
$e^{-x} = \dfrac{1}{e^x} = \dfrac{1}{2^{x \log_2(e)}} = \dfrac{2^{-x}}{2^y}$ donde y es la parte entera y x es la parte fraccionaria. Expresando $e^{-x}$ esta forma me permite reducir el rango del argumento de entrada; dividir un número sin signo por $2^y$ donde y es un número entero positivo, se puede realizar mediante un desplazamiento lógico. Para los argumentos entre 0 y -1 basta con mirar a ojo un Expansión en serie de Taylor de $2^x$ se ve muy bien para sólo 3 términos.
¿Le parece razonable este planteamiento, desde una perspectiva matemática? ¿Problemas que no he tenido en cuenta? Gracias por cualquier consejo.
Edición: Debo añadir que en esta aplicación (procesamiento de audio) estoy dispuesto a sacrificar la precisión absoluta del valor calculado a cambio de la velocidad de procesamiento y de una función que funcione "razonablemente" bien en todo el rango de argumentos de entrada - el valor de retorno para cada argumento en la aproximación no tiene que ser preciso al $2^{-8}$ límite que implica la resolución.