Pythagorean addition

Source: Wikipedia, the free encyclopedia.

In mathematics, Pythagorean addition is a binary operation on the real numbers that computes the length of the hypotenuse of a right triangle, given its two sides. According to the Pythagorean theorem, for a triangle with sides and , this length can be calculated as

where denotes the Pythagorean addition operation.[1]

This operation can be used in the conversion of

energy-momentum relation in physics
becomes
It is implemented in many programming libraries as the hypot function, in a way designed to avoid errors arising due to limited-precision calculations performed on computers. In its applications to
quadratic mean
or "root mean square".

Applications

Example of Pythagorean addition of independent errors using vector addition of orthogonal vectors

Pythagorean addition (and its implementation as the hypot function) is often used together with the atan2 function to convert from Cartesian coordinates to polar coordinates :[3][4]

If measurements have independent errors respectively, the quadrature method gives the overall error,

whereas the upper limit of the overall error is
if the errors were not independent.[5]

This is equivalent of finding the

orthogonal vectors, each with magnitude equal to the uncertainty, using the Pythagorean theorem
.

In signal processing, addition in quadrature is used to find the overall noise from independent sources of noise. For example, if an image sensor gives six digital numbers of shot noise, three of dark current noise and two of Johnson–Nyquist noise under a specific condition, the overall noise is

digital numbers,[6] showing the dominance of larger sources of noise.

The root mean square of a finite set of numbers is just their Pythagorean sum, normalized to form a generalized mean by dividing by .

Properties

The operation is

commutative,[7]
and
This means that the real numbers under form a
commutative semigroup.

The real numbers under are not a group, because can never produce a negative number as its result, whereas each element of a group must be the result of applying the group operation to itself and the

commutative monoid
on the non-negative numbers, with zero as its identity.

Implementation

Hypot is a mathematical function defined to calculate the length of the hypotenuse of a right-angle triangle. It was designed to avoid errors arising due to limited-precision calculations performed on computers. Calculating the length of the hypotenuse of a triangle is possible using the square root function on the sum of two squares, but hypot avoids problems that occur when squaring very large or very small numbers. If calculated using the natural formula,

the squares of very large or small values of and may exceed the range of
overflow. The hypot function was designed to calculate the result without causing this problem.[8]

If either input to hypot is infinite, the result is infinite. Because this is true for all possible values of the other input, the

Since C++17, there has been an additional hypot function for 3D calculations:[10]

Calculation order

The difficulty with the naive implementation is that may overflow or underflow, unless the intermediate result is computed with extended precision. A common implementation technique is to exchange the values, if necessary, so that , and then to use the equivalent form

The computation of cannot overflow unless both and are zero. If underflows, the final result is equal to , which is correct within the precision of the calculation. The square root is computed of a value between 1 and 2. Finally, the multiplication by cannot underflow, and overflows only when the result is too large to represent.[8] This implementation has the downside that it requires an additional floating-point division, which can double the cost of the naive implementation, as multiplication and addition are typically far faster than division and square root. Typically, the implementation is slower by a factor of 2.5 to 3.[11]

More complex implementations avoid this by dividing the inputs into more cases:

  • When is much larger than , , to within
    machine precision
    .
  • When overflows, multiply both and by a small scaling factor (e.g. 2−64 for IEEE single precision), use the naive algorithm which will now not overflow, and multiply the result by the (large) inverse (e.g. 264).
  • When underflows, scale as above but reverse the scaling factors to scale up the intermediate values.
  • Otherwise, the naive algorithm is safe to use.

However, this implementation is extremely slow when it causes incorrect jump predictions due to different cases. Additional techniques allow the result to be computed more accurately, e.g. to less than one ulp.[8]

Programming language support

The function is present in many programming languages and libraries, including CSS,[12] C++11,[13] D,[14] Go,[15] JavaScript (since ES2015),[16] Julia,[17] Java (since version 1.5),[18] Kotlin,[19] MATLAB,[20] PHP,[21] Python,[22] Ruby,[23] Rust,[24] and Scala.[25]

See also

References

  1. .
  2. .
  3. ^ "SIN (3M): Trigonometric functions and their inverses". Unix Programmer's Manual: Reference Guide (4.3 Berkeley Software Distribution Virtual VAX-11 Version ed.). Department of Electrical Engineering and Computer Science, University of California, Berkeley. April 1986.
  4. .
  5. ^ D.B. Schneider, Error Analysis in Measuring Systems, Proceedings of the 1962 Standards Laboratory Conference, page 94
  6. ^ J.T. Bushberg et al, The Essential Physics of Medical Imaging, section 10.2.7, Wolters Kluwer Health
  7. S2CID 121424613
    .
  8. ^ .
  9. ^ Fog, Agner (2020-04-27). "Floating point exception tracking and NAN propagation" (PDF). p. 6.
  10. ^ Common mathematical functions std::hypot, std::hypotf, std::hypotl
  11. ^ Measured on ARM and x64 (Intel and AMD) for different compilers with maximum optimization for 32 bit and 64 bit floats.
  12. ^ Cimpanu, Catalin. "CSS to get support for trigonometry functions". ZDNet. Retrieved 2019-11-01.
  13. ^ "Hypot - C++ Reference".
  14. ^ "STD.math - D Programming Language".
  15. ^ "Math package - math - PKG.go.dev".
  16. ^ "Math.hypot() - JavaScript | MDN". 21 February 2023.
  17. ^ "Mathematics · the Julia Language".
  18. ^ "Math (Java 2 Platform SE 5.0)".
  19. ^ "hypot - Kotlin Programming Language". Kotlin. Retrieved 2018-03-19.
  20. ^ "Square root of sum of squares (Hypotenuse) - MATLAB hypot - MathWorks Benelux".
  21. ^ "PHP: Hypot - Manual".
  22. ^ "Math — Mathematical functions — Python 3.9.7 documentation".
  23. ^ "Module: Math (Ruby 3.0.2)".
  24. ^ "F64 - Rust".
  25. ^ "Scala Standard Library 2.13.6 - scala.math".

Further reading