Relative Difference

Compute the relative difference of two real numbers.

The relative difference of two real numbers is defined as

normal upper Delta left-parenthesis x comma y right-parenthesis equals StartFraction StartAbsoluteValue x minus y EndAbsoluteValue Over StartAbsoluteValue f left-parenthesis x comma y right-parenthesis EndAbsoluteValue EndFraction equals StartAbsoluteValue StartFraction x minus y Over f left-parenthesis x comma y right-parenthesis EndFraction EndAbsoluteValue

where |x-y| is the absolute difference and f(x,y) is a scale function. Common scale functions include

StartLayout 1st Row 1st Column f left-parenthesis x comma y right-parenthesis 2nd Column equals max left-parenthesis StartAbsoluteValue x EndAbsoluteValue comma StartAbsoluteValue y EndAbsoluteValue right-parenthesis 2nd Row 1st Column f left-parenthesis x comma y right-parenthesis 2nd Column equals max left-parenthesis x comma y right-parenthesis 3rd Row 1st Column f left-parenthesis x comma y right-parenthesis 2nd Column equals min left-parenthesis StartAbsoluteValue x EndAbsoluteValue comma StartAbsoluteValue y EndAbsoluteValue right-parenthesis 4th Row 1st Column f left-parenthesis x comma y right-parenthesis 2nd Column equals min left-parenthesis x comma y right-parenthesis 5th Row 1st Column f left-parenthesis x comma y right-parenthesis 2nd Column equals StartFraction StartAbsoluteValue x EndAbsoluteValue plus StartAbsoluteValue y EndAbsoluteValue Over 2 EndFraction 6th Row 1st Column f left-parenthesis x comma y right-parenthesis 2nd Column equals StartFraction x plus y Over 2 EndFraction EndLayout

The choice of scale function depends on application context.

Usage

var reldiff = require( '@stdlib/math/base/utils/relative-difference' );

reldiff( x, y[, scale] )

Computes the relative difference of two real numbers.

var d = reldiff( 2.0, 5.0 ); // => 3/5
// returns 0.6

d = reldiff( -1.0, 3.14 ); // => 4.14/3.14
// returns ~1.318

The following scale functions are supported:

  • max-abs: maximum absolute value of x and y (default).
  • max: maximum value of x and y.
  • min-abs: minimum absolute value of x and y.
  • min: minimum value of x and y.
  • mean-abs: arithmetic mean of the absolute values of x and y.
  • mean: arithmetic mean of x and y.
  • x: x (noncommutative).
  • y: y (noncommutative).

By default, the function scales the absolute difference by dividing the absolute difference by the maximum absolute value of x and y. To scale by a different function, specify a scale function name.

var d = reldiff( -2.0, 5.0 ); // => |-7/5|
// returns 1.4

d = reldiff( -2.0, 5.0, 'max-abs' ); // => |-7/5|
// returns 1.4

d = reldiff( -2.0, 5.0, 'max' ); // => |-7/5|
// returns 1.4

d = reldiff( -2.0, 5.0, 'min-abs' ); // => |-7/2|
// returns 3.5

d = reldiff( -2.0, 5.0, 'min' ); // => |-7/-2|
// returns 3.5

d = reldiff( -2.0, 5.0, 'mean-abs' ); // => |-7/3.5|
// returns 2.0

d = reldiff( -2.0, 5.0, 'mean' ); // => |-7/1.5|
// returns ~4.67

d = reldiff( -2.0, 5.0, 'x' ); // => |-7/-2|
// returns 3.5

d = reldiff( 5.0, -2.0, 'x' ); // => |7/5|
// returns 1.4

d = reldiff( -2.0, 5.0, 'y' ); // => |-7/5|
// returns 1.4

d = reldiff( 5.0, -2.0, 'y' ); // => |7/-2|
// returns 3.5

To use a custom scale function, provide a function which accepts two numeric arguments x and y.

var abs = require( '@stdlib/math/base/special/abs' );
var EPS = require( '@stdlib/constants/math/float64-eps' );

function scale( x, y ) {
    var s;
    x = abs( x );
    y = abs( y );

    // Maximum absolute value:
    s = (x < y ) ? y : x;

    // Scale in units of epsilon:
    return s * EPS;
}

var d = reldiff( 12.15, 12.149999999999999, scale );
// returns ~0.658

Notes

  • If the absolute difference of x and y is 0, the relative difference is always 0.

    var d = reldiff( 0.0, 0.0 );
    // returns 0.0
    
    d = reldiff( 3.14, 3.14 );
    // returns 0.0
    
  • If |x| = |y| = infinity, the function returns NaN.

    var d = reldiff( Infinity, Infinity );
    // returns NaN
    
    d = reldiff( -Infinity, -Infinity );
    // returns NaN
    
  • If |x| = |-y| = infinity, the relative difference is +infinity.

    var d = reldiff( Infinity, -Infinity );
    // returns Infinity
    
    d = reldiff( -Infinity, Infinity );
    // returns Infinity
    
  • If a scale function returns 0, the function returns NaN.

    var d = reldiff( 0.0, 2.0, 'mean' ); // => |2/1|
    // returns 2.0
    
    d = reldiff( -1.0, 1.0, 'mean' ); // => |2/0|
    // returns NaN
    

Examples

var randu = require( '@stdlib/random/base/randu' );
var reldiff = require( '@stdlib/math/base/utils/relative-difference' );

var scales = [ 'max-abs', 'max', 'min-abs', 'min', 'mean-abs', 'mean', 'x', 'y' ];
var x;
var y;
var d;
var i;
var j;

for ( i = 0; i < 100; i++ ) {
    x = ( randu()*1.0e4 ) - 5.0e3;
    y = ( randu()*1.0e4 ) - 5.0e3;
    for ( j = 0; j < scales.length; j++ ) {
        d = reldiff( x, y, scales[j] );
        console.log( 'x = %d. y = %d. d = %d. scale: %s.', x, y, d, scales[j] );
    }
}