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 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | 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 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 3271x 3271x 3271x 3271x 3271x 1x 1x 3271x 4x 4x 3271x 4x 4x 3262x 3262x 3262x 3262x 3262x 3262x 3262x 3262x 3262x 3262x 3262x 3271x 1x 1x 1x 1x 1x | /** * @license Apache-2.0 * * Copyright (c) 2025 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. * * * ## Notice * * The original C code, long comment, copyright, license, and constants are from [Cephes]{@link http://www.netlib.org/cephes}. The implementation follows the original, but has been modified for JavaScript. * * ```text * Copyright 1984, 1995, 2000 by Stephen L. Moshier * * Some software in this archive may be from the book _Methods and Programs for Mathematical Functions_ (Prentice-Hall or Simon & Schuster International, 1989) or from the Cephes Mathematical Library, a commercial product. In either event, it is copyrighted by the author. What you see here may be used freely but it comes with no support or guarantee. * * Stephen L. Moshier * moshier@na-net.ornl.gov * ``` */ 'use strict'; // TODO: replace with TOMS (Openlibm) algo (updating license header and long comment) // MODULES // var FLOAT32_MAX_BASE2_EXPONENT = require( '@stdlib/constants/float32/max-base2-exponent' ); // eslint-disable-line id-length var FLOAT32_MIN_BASE2_EXPONENT = require( '@stdlib/constants/float32/min-base2-exponent' ); // eslint-disable-line id-length var roundf = require( '@stdlib/math/base/special/roundf' ); var ldexpf = require( '@stdlib/math/base/special/ldexpf' ); var isnanf = require( '@stdlib/math/base/assert/is-nanf' ); var float64ToFloat32 = require( '@stdlib/number/float64/base/to-float32' ); var PINF = require( '@stdlib/constants/float32/pinf' ); var polyvalP = require( './polyval_p.js' ); var polyvalQ = require( './polyval_q.js' ); // MAIN // /** * Evaluates the base `2` exponential function. * * ## Method * * - Range reduction is accomplished by separating the argument into an integer \\( k \\) and fraction \\( f \\) such that * * ```tex * 2^x = 2^k 2^f * ``` * * - A Pade' approximate * * ```tex * 1 + 2x \frac{\mathrm{P}\left(x^2\right)}{\mathrm{Q}\left(x^2\right) - x \mathrm{P}\left(x^2\right)} * ``` * * approximates \\( 2^x \\) in the basic range \\( \[-0.5, 0.5] \\). * * ## Notes * * - Relative error: * * | arithmetic | domain | # trials | peak | rms | * |:----------:|:-----------:|:--------:|:-------:|:-------:| * | IEEE | -1022,+1024 | 30000 | 1.8e-16 | 5.4e-17 | * * @param {number} x - input value * @returns {number} function value * * @example * var v = exp2f( 3.0 ); * // returns 8.0 * * @example * var v = exp2f( -9.0 ); * // returns ~0.002 * * @example * var v = exp2f( 0.0 ); * // returns 1.0 * * @example * var v = exp2f( NaN ); * // returns NaN */ function exp2f( x ) { var px; var xx; var n; if ( isnanf( x ) ) { return x; } if ( x > FLOAT32_MAX_BASE2_EXPONENT ) { return PINF; } if ( x < FLOAT32_MIN_BASE2_EXPONENT ) { return float64ToFloat32( 0.0 ); } // Separate into integer and fractional parts... n = float64ToFloat32( roundf( x ) ); x -= float64ToFloat32( n ); xx = float64ToFloat32( x * x ); px = float64ToFloat32( x * polyvalP( xx ) ); x = float64ToFloat32( px / float64ToFloat32( ( polyvalQ( xx ) - px ) ) ); x = float64ToFloat32( 1.0 ) + ldexpf( x, 1 ); // Scale by power of 2: return float64ToFloat32( ldexpf( x, n ) ); } // EXPORTS // module.exports = exp2f; |