La raíz cuadrática media de un conjunto finito de números es simplemente su suma pitagórica, normalizada para formar una media generalizada dividiendo por .
Los números reales siguientes no son un grupo , porque nunca pueden producir un número negativo como resultado, mientras que cada elemento de un grupo debe ser el resultado de aplicar la operación de grupo a sí mismo y al elemento identidad . En los números no negativos, todavía no es un grupo, porque la suma pitagórica de un número por un segundo número positivo solo puede aumentar el primer número, por lo que ningún número positivo puede tener un elemento inverso . En cambio, forma un monoide conmutativo en los números no negativos, con el cero como identidad.
Implementación
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. Calcular la longitud de la hipotenusa de un triángulo es posible utilizando la función de raíz cuadrada de la suma de dos cuadrados , pero la hipotenusa evita los problemas que se producen al elevar al cuadrado números muy grandes o muy pequeños. Si se calcula usando la fórmula natural,
Desde C++17 , ha habido una función hipot adicional para cálculos 3D: [10]
Orden de cálculo
La dificultad con la implementación ingenua es que puede desbordarse o no, a menos que el resultado intermedio se calcule con precisión extendida . Una técnica de implementación común es intercambiar los valores, si es necesario, de modo que y luego usar la forma equivalente
El cálculo de no puede desbordarse a menos que ambos y sean cero. Si el desbordamiento es insuficiente, el resultado final es igual a , que es correcto 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 no puede desbordarse y solo se desborda cuando el resultado es demasiado grande para representarlo. [8] Esta implementación tiene la desventaja de que requiere una división de punto flotante adicional, lo 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. Normalmente, la implementación es más lenta en un factor de 2,5 a 3. [11]
Las implementaciones más complejas evitan esto dividiendo las entradas en más casos:
Cuando se desborde, multiplique ambos y por un factor de escala pequeño (por ejemplo, 2 −64 para precisión simple IEEE), use el algoritmo ingenuo que ahora no se desbordará y multiplique el resultado por el inverso (grande) (por ejemplo, 2 64 ).
Cuando se produzca un desbordamiento insuficiente, escale como se indica arriba, pero invierta los factores de escala para aumentar los valores intermedios.
De lo contrario, el algoritmo ingenuo es seguro de utilizar.
Sin embargo, esta implementación es extremadamente lenta cuando provoca predicciones de salto incorrectas debido a diferentes casos. Técnicas adicionales permiten calcular el resultado con mayor precisión, por ejemplo, con menos de un ulp . [8]
Soporte de lenguaje de programación
La función está presente en muchos lenguajes de programación y bibliotecas, incluido CSS , [12] C++11 , [13] D , [14] Go , [15] JavaScript (desde ES2015), [16] Julia , [17] Java. (desde la versión 1.5), [18] Kotlin , [19] MATLAB , [20] PHP , [21] Python , [22] Ruby , [23] Rust , [24]
y Scala . [25]
Metafont tiene suma y resta pitagóricas como operaciones integradas, bajo los nombres ++y +-+respectivamente.
Referencias
^ Moler, Cleve; Morrison, Donald (1983). "Reemplazar raíces cuadradas por sumas pitagóricas". Revista IBM de investigación y desarrollo . 27 (6): 577–581. CiteSeerX 10.1.1.90.5651 . doi :10.1147/rd.276.0577.
^ Johnson, David L. (2017). "12.2.3 Suma en cuadratura". Herramientas Estadísticas para la Práctica Integral de las Ciencias de la Higiene Industrial y la Salud Ambiental . John Wiley e hijos. pag. 289.ISBN9781119143017.
^ "SIN (3M): Funciones trigonométricas y sus inversas". Manual del programador de Unix: Guía de referencia (4.3 Berkeley Software Distribution Virtual VAX-11 Versión ed.). Departamento de Ingeniería Eléctrica e Informática, Universidad de California, Berkeley. Abril de 1986.
^ Beebe, Nelson HF (2017). Manual de computación de funciones matemáticas: programación utilizando la biblioteca de software portátil MathCW. Saltador. pag. 70.ISBN9783319641102.
^ DB Schneider, Análisis de errores en sistemas de medición, Actas de la Conferencia de laboratorio de normas de 1962, página 94
^ JT Bushberg et al, La física esencial de las imágenes médicas, sección 10.2.7, Wolters Kluwer Health
^ Falmagne, Jean-Claude (2015). "Derivar leyes científicas significativas a partir de axiomas abstractos de tipo" gedanken ": cinco ejemplos". Aecuaciones Mathematicae . 89 (2): 393–435. doi :10.1007/s00010-015-0339-1. SEÑOR 3340218. S2CID 121424613.
↑ abc Borges, Carlos F. (2021). "Algoritmo 1014: un algoritmo mejorado para hipot (x, y)". Transacciones ACM sobre software matemático . 47 (1): 9:1–9:12. arXiv : 1904.09481 . doi :10.1145/3428446. S2CID 230588285.
^ Niebla, Agner (27 de abril de 2020). "Seguimiento de excepciones de punto flotante y propagación NAN" (PDF) . pag. 6.
Dubrulle, Agustín A. (1983). "Una clase de métodos numéricos para el cálculo de sumas pitagóricas" (PDF) . Revista IBM de investigación y desarrollo . 27 (6): 582–589. CiteSeerX 10.1.1.94.3443 . doi :10.1147/rd.276.0582..