Hypot es una función matemática definida para calcular la longitud de la hipotenusa de un triángulo rectángulo. Fue diseñado para evitar errores que surjan debido a cálculos de precisión limitada realizados en computadoras.
Motivación y uso
Es posible calcular la longitud de la hipotenusa de un triángulo usando la función de raíz cuadrada en la suma de dos cuadrados, pero hypot ( x , y ) evita los problemas que ocurren al elevar al cuadrado números muy grandes o muy pequeños.
La magnitud de la hipotenusa de (0, 0) a ( x , y ) se puede calcular usando
Esta operación también se conoce como adición pitagórica .
Sin embargo, los cuadrados de los valores muy grandes o pequeñas de x y y puede exceder el rango de precisión de la máquina cuando se calcula en un ordenador, lo que lleva a un resultado inexacto causada por underflow aritmética y / o de desbordamiento aritmético . La función hypot fue diseñada para calcular el resultado sin causar este problema.
La función hypot se utiliza a menudo junto con el atan2 función para convertir de coordenadas cartesianas a coordenadas polares :
- r = hipot ( x , y ),
- θ = atan2 ( y , x ).
Si cualquiera de las entradas es infinita, el resultado es infinito, es decir
- hipot ( x , ± ∞) = hipot (± ∞, x ) = + ∞
Debido a que esto es cierto para todos los valores posibles de x , incluido el infinito, el estándar de coma flotante IEEE 754 requiere que esta definición también se aplique si x no es un número (NaN). [1]
Implementación
La dificultad con la implementación ingenua es que x 2 o y 2 pueden desbordarse o subdesbordarse, a menos que el resultado intermedio se calcule con mayor precisión . Una técnica de implementación común es intercambiar los valores, si es necesario, de modo que | x | ≥ | y |, y luego usa la forma equivalente [2]
El cálculo de y / x no se puede desbordar a menos que tanto x como y sean 0. Si y / x se desborda, el resultado final es igual a | x |, que es correcta dentro de la precisión del cálculo. La raíz cuadrada se calcula con un valor entre 1 y 2. Finalmente, la multiplicación por | x | no se puede desbordar y se desborda solo cuando el resultado es demasiado grande para representarlo.
Esta implementación tiene la desventaja de que requiere una división de punto flotante adicional, que puede duplicar el costo de la implementación ingenua, ya que la multiplicación y la suma suelen ser mucho más rápidas que la división y la raíz cuadrada.
Las implementaciones más complejas evitan esto dividiendo las entradas en más casos:
- x ≫ y : hypot ( x , y ) = | x |, dentro de la precisión de la máquina .
- x 2 desbordamientos: multiplicar ambos x y Y por un factor de escala pequeña (por ejemplo, 2 -64 para IEEE de precisión simple), utilizar el algoritmo ingenuo que ahora no desbordamiento, y multiplicar el resultado por el (grande) inversa (por ejemplo, 2 64 ) .
- y 2 subdesbordamientos: igual que arriba, pero invierta los factores de escala para escalar los valores intermedios.
- De lo contrario: el algoritmo ingenuo es seguro de usar.
Las técnicas adicionales permiten que el resultado se calcule con mayor precisión, por ejemplo, a menos de un ulp . [3]
Soporte de lenguaje de programación
La función está presente en varios lenguajes de programación:
- C99
- CSS [4]
- C ++ 11 [5]
- D (lenguaje de programación) [6]
- Fortran 2008
- Julia (lenguaje de programación) [7]
- Swift (lenguaje de programación)
- Python (lenguaje de programación) [8]
- Numéricos de PowerPC de Apple [9]
- MATLAB [10]
- Pascal [11]
- PHP [12]
- Java (lenguaje de programación) (desde la versión 1.5) [13]
- Kotlin [14]
- Rubí [15]
- Ir [16]
- Óxido [17]
- JavaScript (desde ES2015) [18]
- Algunas bibliotecas C90 y C ++ han proporcionado una función hipotética. [19] [20] [21]
- Scala [22]
Ver también
- Algoritmo alpha max plus beta min , un algoritmo más rápido que produce un resultado aproximado
Referencias
- ↑ Niebla, Agner (27 de abril de 2020). "Seguimiento de excepciones de punto flotante y propagación NAN" (PDF) . pag. 6.
- ^ En algunas situaciones, la última forma reduce los errores de cálculo (en ULP ).
- ^ Borges, Carlos F. (14 de junio de 2019). "Un algoritmo mejorado para hypot (a, b)". arXiv : 1904.09481 [ math.NA ].
- ^ Cimpanu, Catalin. "CSS para obtener soporte para funciones de trigonometría" . ZDNet . Consultado el 1 de noviembre de 2019 .
- ^ http://www.cplusplus.com/reference/cmath/hypot/
- ^ https://dlang.org/phobos/std_math.html#.hypot
- ^ https://docs.julialang.org/en/v1/base/math/#Base.Math.hypot
- ^ https://docs.python.org/3/library/math.html#math.hypot
- ^ https://developer.apple.com/DOCUMENTATION/mac/PPCNumerics/PPCNumerics-141.html
- ^ http://nl.mathworks.com/help/matlab/ref/hypot.html
- ^ http://www.frameworkpascal.com/helphtml/hypot_func.htm
- ^ http://www.php.net/hypot
- ^ http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Math.html#hypot(double,%20double)
- ^ "hypot - lenguaje de programación Kotlin" . Kotlin . Consultado el 19 de marzo de 2018 .
- ^ http://ruby-doc.org/core/Math.html#method-c-hypot
- ^ http://golang.org/pkg/math/#Hypot
- ^ https://doc.rust-lang.org/std/primitive.f64.html#method.hypot
- ^ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/hypot
- ^ Especificación única de Unix, grupo abierto, http://www.opengroup.org/onlinepubs/007908799/xsh/hypot.html
- ^ IBM, Funciones de biblioteca en tiempo de ejecución ILE C / C ++, http://publib.boulder.ibm.com/infocenter/iadthelp/v7r0/index.jsp?topic=/com.ibm.etools.iseries.langref.doc/ rzan5mst144.htm
- ↑ The GNU C Library, Mathematics, http://www.cs.utah.edu/dept/old/texinfo/glibc-manual-0.02/library_17.html Archivado 2009-03-05 en Wayback Machine
- ^ https://www.scala-lang.org/api/current/scala/math/index.html#hypot(x:Double,y:Double):Double