Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

hypot

Compute the hypotenuse avoiding overflow and underflow.

Usage

var hypot = require( '@stdlib/math/base/special/hypot' );

hypot( x, y )

Computes the hypotenuse avoiding overflow and underflow.

var h = hypot( -5.0, 12.0 );
// returns 13.0

h = hypot( -0.0, -0.0 );
// returns +0.0

If either argument is NaN, the function returns NaN.

var h = hypot( NaN, 12.0 );
// returns NaN

h = hypot( 5.0, NaN );
// returns NaN

Notes

  • The textbook approach to calculating the hypotenuse is subject to overflow and underflow. For example, for a sufficiently large x and/or y, computing the hypotenuse will overflow.

    var sqrt = require( '@stdlib/math/base/special/sqrt' );
    
    var x2 = 1.0e154 * 1.0e154;
    // returns 1.0e308
    
    var h = sqrt( x2 + x2 );
    // returns Number.POSITIVE_INFINITY

    Similarly, for sufficiently small x and/or y, computing the hypotenuse will underflow.

    var sqrt = require( '@stdlib/math/base/special/sqrt' );
    
    var x2 = 1.0e-200 * 1.0e-200;
    // returns 0.0
    
    var h = sqrt( x2 + x2 );
    // returns 0.0

    This implementation uses a numerically stable algorithm which avoids overflow and underflow.

    var h = hypot( 1.0e154, 1.0e154 );
    // returns ~1.4142e308
    
    h = hypot( 1.0e-200, 1.0e-200 );
    // returns ~1.4142e-200

Examples

var randu = require( '@stdlib/math/base/random/randu' );
var round = require( '@stdlib/math/base/special/round' );
var hypot = require( '@stdlib/math/base/special/hypot' );

var x;
var y;
var h;
var i;

for ( i = 0; i < 100; i++ ) {
    x = round( randu()*100.0 ) - 50.0;
    y = round( randu()*100.0 ) - 50.0;
    h = hypot( x, y );
    console.log( 'h(%d,%d) = %d', x, y, h );
}