All files main.js

98.19% Statements 109/111
96% Branches 24/25
100% Functions 1/1
98.19% Lines 109/111

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 1121x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 51x 51x 51x 51x 51x 51x 51x 51x 51x 51x 51x 51x 51x 39x 51x 13x 13x 51x 6x 6x 51x 21x 51x 7x 11x 4x 4x 32x 32x 32x 32x 51x 7x 7x 25x 51x 14x 51x 11x 11x 25x 51x     25x 51x 1x 1x 1x 1x 1x  
/**
* @license Apache-2.0
*
* Copyright (c) 2026 The Stdlib Authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*    http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
 
'use strict';
 
// MODULES //
 
var isInfinitef = require( '@stdlib/math/base/assert/is-infinitef' );
var isnanf = require( '@stdlib/math/base/assert/is-nanf' );
var exponentf = require( '@stdlib/number/float32/base/exponent' );
var f32 = require( '@stdlib/number/float64/base/to-float32' );
var log10f = require( '@stdlib/math/base/special/log10f' );
var floorf = require( '@stdlib/math/base/special/floorf' );
var truncf = require( '@stdlib/math/base/special/truncf' );
var powf = require( '@stdlib/math/base/special/powf' );
var absf = require( '@stdlib/math/base/special/absf' );
var lnf = require( '@stdlib/math/base/special/lnf' );
 
 
// MAIN //
 
/**
* Rounds a single-precision floating-point number to the nearest number toward zero with `n` significant figures.
*
* @param {number} x - input value
* @param {PositiveInteger} n - number of significant figures
* @param {PositiveInteger} b - base
* @returns {number} rounded value
*
* @example
* var v = truncsdf( 3.1415927410125732, 5, 10 );
* // returns 3.1414999961853027
*
* @example
* var v = truncsdf( 3.1415927410125732, 1, 10 );
* // returns 3.0
*
* @example
* var v = truncsdf( 12368.0, 2, 10 );
* // returns 12000.0
*
* @example
* var v = truncsdf( 0.0313, 2, 2 );
* // returns 0.03125
*/
function truncsdf( x, n, b ) {
	var exp;
	var s;
	var y;
 
	x = f32( x );
	if (
		isnanf( x ) ||
		isnanf( n ) ||
		n < 1 ||
		isInfinitef( n ) ||
		isnanf( b ) ||
		b <= 0 ||
		isInfinitef( b )
	) {
		return NaN;
	}
	if ( isInfinitef( x ) || x === 0.0 ) {
		return x;
	}
	if ( b === 10 ) {
		exp = log10f( absf( x ) );
	} else if ( b === 2 ) {
		exp = exponentf( absf( x ) );
	} else {
		exp = f32( lnf( absf( x ) ) / lnf( f32( b ) ) );
	}
	exp = floorf( f32( f32( exp - f32( n ) ) + 1.0 ) );
	s = powf( f32( b ), absf( exp ) );
 
	// Check for overflow:
	if ( isInfinitef( s ) ) {
		return x;
	}
	// To avoid numerical stability issues due to floating-point rounding error, we must treat positive and negative exponents separately:
	if ( exp < 0.0 ) {
		y = f32( truncf( f32( x * s ) ) / s );
	} else {
		y = f32( truncf( f32( x / s ) ) * s );
	}
	// Check for overflow:
	if ( isInfinitef( y ) ) {
		return x;
	}
	return y;
}
 
 
// EXPORTS //
 
module.exports = truncsdf;