diff --git a/lib/node_modules/@stdlib/stats/base/dists/planck/quantile/lib/factory.js b/lib/node_modules/@stdlib/stats/base/dists/planck/quantile/lib/factory.js index 8beaa7405647..5ae98175d721 100644 --- a/lib/node_modules/@stdlib/stats/base/dists/planck/quantile/lib/factory.js +++ b/lib/node_modules/@stdlib/stats/base/dists/planck/quantile/lib/factory.js @@ -23,7 +23,8 @@ var constantFunction = require( '@stdlib/utils/constant-function' ); var isnan = require( '@stdlib/math/base/assert/is-nan' ); var ceil = require( '@stdlib/math/base/special/ceil' ); -var ln = require( '@stdlib/math/base/special/ln' ); +var log1p = require( '@stdlib/math/base/special/log1p' ); +var max = require( '@stdlib/math/base/special/max' ); var PINF = require( '@stdlib/constants/float64/pinf' ); @@ -70,7 +71,7 @@ function factory( lambda ) { if ( p === 1.0 ) { return PINF; } - return ceil( -ln( 1.0-p ) / lambda ) - 1.0; + return max( 0.0, ceil( -log1p( -p ) / lambda ) - 1.0 ); } } diff --git a/lib/node_modules/@stdlib/stats/base/dists/planck/quantile/lib/main.js b/lib/node_modules/@stdlib/stats/base/dists/planck/quantile/lib/main.js index 90639967c5d1..b1a261e483f6 100644 --- a/lib/node_modules/@stdlib/stats/base/dists/planck/quantile/lib/main.js +++ b/lib/node_modules/@stdlib/stats/base/dists/planck/quantile/lib/main.js @@ -22,7 +22,8 @@ var isnan = require( '@stdlib/math/base/assert/is-nan' ); var ceil = require( '@stdlib/math/base/special/ceil' ); -var ln = require( '@stdlib/math/base/special/ln' ); +var log1p = require( '@stdlib/math/base/special/log1p' ); +var max = require( '@stdlib/math/base/special/max' ); var PINF = require( '@stdlib/constants/float64/pinf' ); @@ -74,7 +75,7 @@ function quantile( p, lambda ) { if ( p === 1.0 ) { return PINF; } - return ceil( -ln( 1.0-p ) / lambda ) - 1.0; + return max( 0.0, ceil( -log1p( -p ) / lambda ) - 1.0 ); } diff --git a/lib/node_modules/@stdlib/stats/base/dists/planck/quantile/manifest.json b/lib/node_modules/@stdlib/stats/base/dists/planck/quantile/manifest.json index 36f6fecd0dfc..60de0141d359 100644 --- a/lib/node_modules/@stdlib/stats/base/dists/planck/quantile/manifest.json +++ b/lib/node_modules/@stdlib/stats/base/dists/planck/quantile/manifest.json @@ -41,7 +41,8 @@ "@stdlib/math/base/napi/binary", "@stdlib/math/base/assert/is-nan", "@stdlib/math/base/special/ceil", - "@stdlib/math/base/special/ln", + "@stdlib/math/base/special/log1p", + "@stdlib/math/base/special/max", "@stdlib/constants/float64/pinf" ] }, @@ -59,7 +60,8 @@ "dependencies": [ "@stdlib/math/base/assert/is-nan", "@stdlib/math/base/special/ceil", - "@stdlib/math/base/special/ln", + "@stdlib/math/base/special/log1p", + "@stdlib/math/base/special/max", "@stdlib/constants/float64/pinf" ] }, @@ -77,7 +79,8 @@ "dependencies": [ "@stdlib/math/base/assert/is-nan", "@stdlib/math/base/special/ceil", - "@stdlib/math/base/special/ln", + "@stdlib/math/base/special/log1p", + "@stdlib/math/base/special/max", "@stdlib/constants/float64/pinf" ] } diff --git a/lib/node_modules/@stdlib/stats/base/dists/planck/quantile/src/main.c b/lib/node_modules/@stdlib/stats/base/dists/planck/quantile/src/main.c index 91905928207d..713a964e60da 100644 --- a/lib/node_modules/@stdlib/stats/base/dists/planck/quantile/src/main.c +++ b/lib/node_modules/@stdlib/stats/base/dists/planck/quantile/src/main.c @@ -19,7 +19,8 @@ #include "stdlib/stats/base/dists/planck/quantile.h" #include "stdlib/math/base/assert/is_nan.h" #include "stdlib/math/base/special/ceil.h" -#include "stdlib/math/base/special/ln.h" +#include "stdlib/math/base/special/log1p.h" +#include "stdlib/math/base/special/max.h" #include "stdlib/constants/float64/pinf.h" /** @@ -40,5 +41,5 @@ double stdlib_base_dists_planck_quantile( const double p, const double lambda ) if ( p == 1.0 ) { return STDLIB_CONSTANT_FLOAT64_PINF; } - return stdlib_base_ceil( -stdlib_base_ln( 1.0 - p ) / lambda ) - 1.0; + return stdlib_base_max( 0.0, stdlib_base_ceil( -stdlib_base_log1p( -p ) / lambda ) - 1.0 ); } diff --git a/lib/node_modules/@stdlib/stats/base/dists/planck/quantile/test/test.factory.js b/lib/node_modules/@stdlib/stats/base/dists/planck/quantile/test/test.factory.js index 44427a1e4fc6..b0c6a9b69372 100644 --- a/lib/node_modules/@stdlib/stats/base/dists/planck/quantile/test/test.factory.js +++ b/lib/node_modules/@stdlib/stats/base/dists/planck/quantile/test/test.factory.js @@ -146,3 +146,42 @@ tape( 'the returned function evaluates the quantile for `p` given large paramete } t.end(); }); + +tape( 'the returned function evaluates the quantile for small `p`', function test( t ) { + var quantile; + var y; + + quantile = factory( 1.0 ); + y = quantile( 1.0e-20 ); + t.strictEqual( y, 0.0, 'returns expected value' ); + + y = quantile( 1.0e-300 ); + t.strictEqual( y, 0.0, 'returns expected value' ); + + quantile = factory( 1.0e-17 ); + y = quantile( 1.0e-15 ); + t.strictEqual( y, 100.0, 'returns expected value' ); + + quantile = factory( 1.0e-14 ); + y = quantile( 1.0e-12 ); + t.strictEqual( y, 100.0, 'returns expected value' ); + t.end(); +}); + +tape( 'the returned function returns `0` for `p = 0` and where `-ln(1-p)/lambda` underflows', function test( t ) { + var quantile; + var y; + + quantile = factory( 1.0 ); + y = quantile( 0.0 ); + t.strictEqual( y, 0.0, 'returns expected value' ); + + quantile = factory( 2.0 ); + y = quantile( 5.0e-324 ); + t.strictEqual( y, 0.0, 'returns expected value' ); + + quantile = factory( 1.0e300 ); + y = quantile( 1.0e-300 ); + t.strictEqual( y, 0.0, 'returns expected value' ); + t.end(); +}); diff --git a/lib/node_modules/@stdlib/stats/base/dists/planck/quantile/test/test.native.js b/lib/node_modules/@stdlib/stats/base/dists/planck/quantile/test/test.native.js index 97e97b213345..137c8b765ae0 100644 --- a/lib/node_modules/@stdlib/stats/base/dists/planck/quantile/test/test.native.js +++ b/lib/node_modules/@stdlib/stats/base/dists/planck/quantile/test/test.native.js @@ -118,3 +118,34 @@ tape( 'the function evaluates the quantile for `p` given large parameter `lambda } t.end(); }); + +tape( 'the function evaluates the quantile for small `p`', opts, function test( t ) { + var y; + + y = quantile( 1.0e-20, 1.0 ); + t.strictEqual( y, 0.0, 'returns expected value' ); + + y = quantile( 1.0e-300, 1.0 ); + t.strictEqual( y, 0.0, 'returns expected value' ); + + y = quantile( 1.0e-15, 1.0e-17 ); + t.strictEqual( y, 100.0, 'returns expected value' ); + + y = quantile( 1.0e-12, 1.0e-14 ); + t.strictEqual( y, 100.0, 'returns expected value' ); + t.end(); +}); + +tape( 'the function returns `0` for `p = 0` and where `-ln(1-p)/lambda` underflows', opts, function test( t ) { + var y; + + y = quantile( 0.0, 1.0 ); + t.strictEqual( y, 0.0, 'returns expected value' ); + + y = quantile( 5.0e-324, 2.0 ); + t.strictEqual( y, 0.0, 'returns expected value' ); + + y = quantile( 1.0e-300, 1.0e300 ); + t.strictEqual( y, 0.0, 'returns expected value' ); + t.end(); +}); diff --git a/lib/node_modules/@stdlib/stats/base/dists/planck/quantile/test/test.quantile.js b/lib/node_modules/@stdlib/stats/base/dists/planck/quantile/test/test.quantile.js index f7a0122742d3..eef4c3fcee9c 100644 --- a/lib/node_modules/@stdlib/stats/base/dists/planck/quantile/test/test.quantile.js +++ b/lib/node_modules/@stdlib/stats/base/dists/planck/quantile/test/test.quantile.js @@ -109,3 +109,34 @@ tape( 'the function evaluates the quantile for `p` given large parameter `lambda } t.end(); }); + +tape( 'the function evaluates the quantile for small `p`', function test( t ) { + var y; + + y = quantile( 1.0e-20, 1.0 ); + t.strictEqual( y, 0.0, 'returns expected value' ); + + y = quantile( 1.0e-300, 1.0 ); + t.strictEqual( y, 0.0, 'returns expected value' ); + + y = quantile( 1.0e-15, 1.0e-17 ); + t.strictEqual( y, 100.0, 'returns expected value' ); + + y = quantile( 1.0e-12, 1.0e-14 ); + t.strictEqual( y, 100.0, 'returns expected value' ); + t.end(); +}); + +tape( 'the function returns `0` for `p = 0` and where `-ln(1-p)/lambda` underflows', function test( t ) { + var y; + + y = quantile( 0.0, 1.0 ); + t.strictEqual( y, 0.0, 'returns expected value' ); + + y = quantile( 5.0e-324, 2.0 ); + t.strictEqual( y, 0.0, 'returns expected value' ); + + y = quantile( 1.0e-300, 1.0e300 ); + t.strictEqual( y, 0.0, 'returns expected value' ); + t.end(); +});