X-Git-Url: https://git.ladys.computer/Pisces/blobdiff_plain/58d78d7c0602b17a9599e28232cc8a2ff1d8fc65..refs/heads/current:/numeric.js?ds=sidebyside diff --git a/numeric.js b/numeric.js index 5a3d6ea..079e56e 100644 --- a/numeric.js +++ b/numeric.js @@ -7,7 +7,8 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at . -import { call } from "./function.js"; +import { call, createArrowFunction } from "./function.js"; +import { defineOwnDataProperty } from "./object.js"; import { stringCatenate, stringPadEnd, @@ -15,381 +16,14 @@ import { substring, toString, } from "./string.js"; -import { sameValue, toPrimitive } from "./value.js"; - -export const { - /** - * ln(10). - * - * ※ This is an alias for `Math.LN10`. - */ - LN10, - - /** - * ln(2). - * - * ※ This is an alias for `Math.LN2`. - */ - LN2, - - /** - * log10(ℇ). - * - * ※ This is an alias for `Math.LOG10E`. - */ - LOG10E: LOG10ℇ, - - /** - * log2(ℇ). - * - * ※ This is an alias for `Math.LOG2E`. - */ - LOG2E: LOG2ℇ, - - /** - * sqrt(½). - * - * ※ This is an alias for `Math.SQRT1_2`. - */ - SQRT1_2: RECIPROCAL_SQRT2, - - /** - * sqrt(2). - * - * ※ This is an alias for `Math.SQRT2`. - */ - SQRT2, - - /** - * Returns the arccos of the provided value. - * - * ※ This is an alias for `Math.acos`. - * - * ☡ This function does not allow big·int arguments. - */ - acos: arccos, - - /** - * Returns the arccosh of the provided value. - * - * ※ This is an alias for `Math.acosh`. - * - * ☡ This function does not allow big·int arguments. - */ - acosh: arccosh, - - /** - * Returns the arcsin of the provided value. - * - * ※ This is an alias for `Math.asin`. - * - * ☡ This function does not allow big·int arguments. - */ - asin: arcsin, - - /** - * Returns the arcsinh of the provided value. - * - * ※ This is an alias for `Math.asinh`. - * - * ☡ This function does not allow big·int arguments. - */ - asinh: arcsinh, - - /** - * Returns the arctan of the provided value. - * - * ※ This is an alias for `Math.atan`. - * - * ☡ This function does not allow big·int arguments. - */ - atan: arctan, - - /** - * Returns the arctanh of the provided value. - * - * ※ This is an alias for `Math.atanh`. - * - * ☡ This function does not allow big·int arguments. - */ - atanh: arctanh, - - /** - * Returns the cube root of the provided value. - * - * ※ This is an alias for `Math.cbrt`. - * - * ☡ This function does not allow big·int arguments. - */ - cbrt, - - /** - * Returns the ceiling of the provided value. - * - * ※ This is an alias for `Math.ceil`. - * - * ☡ This function does not allow big·int arguments. - */ - ceil, - - /** - * Returns the cos of the provided value. - * - * ※ This is an alias for `Math.cos`. - * - * ☡ This function does not allow big·int arguments. - */ - cos, - - /** - * Returns the cosh of the provided value. - * - * ※ This is an alias for `Math.cosh`. - * - * ☡ This function does not allow big·int arguments. - */ - cosh, - - /** - * Returns the Euler number raised to the provided value. - * - * ※ This is an alias for `Math.exp`. - * - * ☡ This function does not allow big·int arguments. - */ - exp, - - /** - * Returns the Euler number raised to the provided value, minus one. - * - * ※ This is an alias for `Math.expm1`. - * - * ☡ This function does not allow big·int arguments. - */ - expm1, - - /** - * Returns the floor of the provided value. - * - * ※ This is an alias for `Math.floor`. - * - * ☡ This function does not allow big·int arguments. - */ - floor, - - /** - * Returns the square root of the sum of the squares of the provided - * arguments. - * - * ※ This is an alias for `Math.hypot`. - * - * ☡ This function does not allow big·int arguments. - */ - hypot, - - /** - * Returns the ln of the provided value. - * - * ※ This is an alias for `Math.log`. - * - * ☡ This function does not allow big·int arguments. - */ - log: ln, - - /** - * Returns the log10 of the provided value. - * - * ※ This is an alias for `Math.log10`. - * - * ☡ This function does not allow big·int arguments. - */ - log10, - - /** - * Returns the ln of one plus the provided value. - * - * ※ This is an alias for `Math.log1p`. - * - * ☡ This function does not allow big·int arguments. - */ - log1p: ln1p, - - /** - * Returns the log2 of the provided value. - * - * ※ This is an alias for `Math.log2`. - * - * ☡ This function does not allow big·int arguments. - */ - log2, - - /** - * Returns a pseudo·random value in the range [0, 1). - * - * ※ This is an alias for `Math.random`. - */ - random: rand, - - /** - * Returns the round of the provided value. - * - * ※ This is an alias for `Math.round`. - * - * ☡ This function does not allow big·int arguments. - */ - round, - - /** - * Returns the sinh of the provided value. - * - * ※ This is an alias for `Math.sinh`. - * - * ☡ This function does not allow big·int arguments. - */ - sinh, - - /** - * Returns the square root of the provided value. - * - * ※ This is an alias for `Math.sqrt`. - * - * ☡ This function does not allow big·int arguments. - */ - sqrt, - - /** - * Returns the tan of the provided value. - * - * ※ This is an alias for `Math.tan`. - * - * ☡ This function does not allow big·int arguments. - */ - tan, - - /** - * Returns the tanh of the provided value. - * - * ※ This is an alias for `Math.tanh`. - * - * ☡ This function does not allow big·int arguments. - */ - tanh, - - /** - * Returns the trunc of the provided value. - * - * ※ This is an alias for `Math.trunc`. - * - * ☡ This function does not allow big·int arguments. - */ - trunc, - - /** - * The mathematical constant π. - * - * ※ This is an alias for `Math.PI`. - */ - PI: Π, - - /** - * The Euler number. - * - * ※ This is an alias for `Math.E`. - */ - E: ℇ, -} = Math; - -export const { - /** - * The largest number value less than infinity. - * - * ※ This is an alias for `Number.MAX_VALUE`. - */ - MAX_VALUE: MAXIMUM_NUMBER, - - /** - * 2**53 - 1. - * - * ※ This is an alias for `Number.MAX_SAFE_INTEGER`. - */ - MAX_SAFE_INTEGER: MAXIMUM_SAFE_INTEGRAL_NUMBER, - - /** - * The smallest number value greater than negative infinity. - * - * ※ This is an alias for `Number.MIN_VALUE`. - */ - MIN_VALUE: MINIMUM_NUMBER, - - /** - * -(2**53 - 1). - * - * ※ This is an alias for `Number.MIN_SAFE_INTEGER`. - */ - MIN_SAFE_INTEGER: MINIMUM_SAFE_INTEGRAL_NUMBER, - - /** - * Negative infinity. - * - * ※ This is an alias for `Number.NEGATIVE_INFINITY`. - */ +import { + NAN, NEGATIVE_INFINITY, - - /** - * Nan. - * - * ※ This is an alias for `Number.NaN`. - */ - NaN: NAN, - - /** - * Positive infinity. - * - * ※ This is an alias for `Number.POSITIVE_INFINITY`. - */ POSITIVE_INFINITY, - - /** - * The difference between 1 and the smallest number greater than 1. - * - * ※ This is an alias for `Number.EPSILON`. - */ - EPSILON: Ε, - - /** - * Returns whether the provided value is a finite number. - * - * ※ This is an alias for `Number.isFinite`. - */ - isFinite: isFiniteNumber, - - /** - * Returns whether the provided value is an integral number. - * - * ※ This is an alias for `Number.isInteger`. - */ - isInteger: isIntegralNumber, - - /** - * Returns whether the provided value is nan. - * - * ※ This is an alias for `Number.isNaN`. - */ - isNaN: isNan, - - /** - * Returns whether the provided value is a safe integral number. - * - * ※ This is an alias for `Number.isSafeInteger`. - */ - isSafeInteger: isSafeIntegralNumber, -} = Number; - -/** Positive zero. */ -export const POSITIVE_ZERO = 0; - -/** Negative zero. */ -export const NEGATIVE_ZERO = -0; + sameValue, + toPrimitive, + UNDEFINED, +} from "./value.js"; /** * Returns the magnitude (absolute value) of the provided value. @@ -411,6 +45,66 @@ export const abs = ($) => { : n; }; +/** + * Returns the arccos of the provided value. + * + * ※ This function is effectively an alias for `Math.acos`. + * + * ☡ This function does not allow big·int arguments. + */ +export const arccos = createArrowFunction( + Math.acos, + { name: "arccos" }, +); + +/** + * Returns the arccosh of the provided value. + * + * ※ This function is effectively an alias for `Math.acosh`. + * + * ☡ This function does not allow big·int arguments. + */ +export const arccosh = createArrowFunction( + Math.acosh, + { name: "arccosh" }, +); + +/** + * Returns the arcsin of the provided value. + * + * ※ This function is effectively an alias for `Math.asin`. + * + * ☡ This function does not allow big·int arguments. + */ +export const arcsin = createArrowFunction( + Math.asin, + { name: "arcsin" }, +); + +/** + * Returns the arcsinh of the provided value. + * + * ※ This function is effectively an alias for `Math.asinh`. + * + * ☡ This function does not allow big·int arguments. + */ +export const arcsinh = createArrowFunction( + Math.asinh, + { name: "arcsinh" }, +); + +/** + * Returns the arctan of the provided value. + * + * ※ This function is effectively an alias for `Math.atan`. + * + * ☡ This function does not allow big·int arguments. + */ +export const arctan = createArrowFunction( + Math.atan, + { name: "arctan" }, +); + export const { /** * Returns the arctangent of the dividend of the provided values. @@ -418,7 +112,7 @@ export const { * ※ Unlike `Math.atan2`, this function can take big·int arguments. * However, the result will always be a number. */ - atan2, + arctan2, /** * Returns the number of leading zeroes in the 32‐bit representation @@ -440,7 +134,7 @@ export const { } = (() => { const { atan2, fround, clz32 } = Math; return { - atan2: (y, x) => atan2(toNumber(y), toNumber(x)), + arctan2: (y, x) => atan2(toNumber(y), toNumber(x)), clz32: ($) => { const n = toNumeric($); return clz32( @@ -453,6 +147,167 @@ export const { }; })(); +/** + * Returns the arctanh of the provided value. + * + * ※ This function is effectively an alias for `Math.atanh`. + * + * ☡ This function does not allow big·int arguments. + */ +export const arctanh = createArrowFunction( + Math.atanh, + { name: "arctanh" }, +); + +/** + * Returns the cube root of the provided value. + * + * ※ This function is effectively an alias for `Math.cbrt`. + * + * ☡ This function does not allow big·int arguments. + */ +export const cbrt = createArrowFunction(Math.cbrt); + +/** + * Returns the ceiling of the provided value. + * + * ※ This function is effectively an alias for `Math.ceil`. + * + * ☡ This function does not allow big·int arguments. + */ +export const ceil = createArrowFunction(Math.ceil); + +/** + * Returns the cos of the provided value. + * + * ※ This function is effectively an alias for `Math.cos`. + * + * ☡ This function does not allow big·int arguments. + */ +export const cos = createArrowFunction(Math.cos); + +/** + * Returns the cosh of the provided value. + * + * ※ This function is effectively an alias for `Math.cosh`. + * + * ☡ This function does not allow big·int arguments. + */ +export const cosh = createArrowFunction(Math.cosh); + +/** + * Returns the Euler number raised to the provided value. + * + * ※ This function is effectively an alias for `Math.exp`. + * + * ☡ This function does not allow big·int arguments. + */ +export const exp = createArrowFunction(Math.exp); + +/** + * Returns the Euler number raised to the provided value, minus one. + * + * ※ This function is effectively an alias for `Math.expm1`. + * + * ☡ This function does not allow big·int arguments. + */ +export const expm1 = createArrowFunction(Math.expm1); + +/** + * Returns the floor of the provided value. + * + * ※ This function is effectively an alias for `Math.floor`. + * + * ☡ This function does not allow big·int arguments. + */ +export const floor = createArrowFunction(Math.floor); + +/** + * Returns the square root of the sum of the squares of the provided + * arguments. + * + * ※ This function is effectively an alias for `Math.hypot`. + * + * ☡ This function does not allow big·int arguments. + */ +export const hypot = createArrowFunction(Math.hypot); + +/** + * Returns whether the provided value is a finite number. + * + * ※ This function is effectively an alias for `Number.isFinite`. + */ +export const isFiniteNumber = createArrowFunction( + Number.isFinite, + { name: "isFiniteNumber" }, +); + +/** + * Returns whether the provided value is an integral number. + * + * ※ This function is effectively an alias for `Number.isInteger`. + */ +export const isIntegralNumber = createArrowFunction( + Number.isInteger, + { name: "isIntegralNumber" }, +); + +/** + * Returns whether the provided value is nan. + * + * ※ This function is effectively an alias for `Number.isNaN`. + */ +export const isNan = createArrowFunction( + Number.isNaN, + { name: "isNan" }, +); + +/** + * Returns whether the provided value is a safe integral number. + * + * ※ This function is effectively an alias for `Number.isSafeInteger`. + */ +export const isSafeIntegralNumber = createArrowFunction( + Number.isSafeInteger, + { name: "isSafeIntegralNumber" }, +); + +/** + * Returns the ln of the provided value. + * + * ※ This function is effectively an alias for `Math.log`. + * + * ☡ This function does not allow big·int arguments. + */ +export const ln = createArrowFunction(Math.log, { name: "ln" }); + +/** + * Returns the ln of one plus the provided value. + * + * ※ This function is effectively an alias for `Math.log1p`. + * + * ☡ This function does not allow big·int arguments. + */ +export const ln1p = createArrowFunction(Math.log1p, { name: "ln1p" }); + +/** + * Returns the log10 of the provided value. + * + * ※ This function is effectively an alias for `Math.log10`. + * + * ☡ This function does not allow big·int arguments. + */ +export const log10 = createArrowFunction(Math.log10); + +/** + * Returns the log2 of the provided value. + * + * ※ This function is effectively an alias for `Math.log2`. + * + * ☡ This function does not allow big·int arguments. + */ +export const log2 = createArrowFunction(Math.log2); + /** * Returns the highest value of the provided arguments, or negative * infinity if no argument is provided. @@ -464,12 +319,12 @@ export const { * ☡ If no argument is supplied, the result will be a number, not a * big·int. */ -export const max = (...$s) => { - let highest = undefined; +export const max = Object.defineProperties((...$s) => { + let highest = UNDEFINED; for (let i = 0; i < $s.length; ++i) { // Iterate over all the numbers. const number = toNumeric($s[i]); - if (highest === undefined) { + if (highest === UNDEFINED) { // The current number is the first one. if (isNan(number)) { // The current number is nan. @@ -489,7 +344,7 @@ export const max = (...$s) => { } else if (sameValue(number, 0) && sameValue(highest, -0)) { // The current number is +0 and the highest number is -0. highest = 0; - } else if (highest === undefined || number > highest) { + } else if (number > highest) { // The current number is greater than the highest number. highest = number; } else { @@ -500,7 +355,10 @@ export const max = (...$s) => { } } return highest ?? NEGATIVE_INFINITY; -}; +}, { + name: defineOwnDataProperty(Object.create(null), "value", "max"), + length: defineOwnDataProperty(Object.create(null), "value", 2), +}); /** * Returns the lowest value of the provided arguments, or positive @@ -513,12 +371,12 @@ export const max = (...$s) => { * ☡ If no argument is supplied, the result will be a number, not a * big·int. */ -export const min = (...$s) => { - let lowest = undefined; +export const min = Object.defineProperties((...$s) => { + let lowest = UNDEFINED; for (let i = 0; i < $s.length; ++i) { // Iterate over all the numbers. const number = toNumeric($s[i]); - if (lowest === undefined) { + if (lowest === UNDEFINED) { // The current number is the first one. if (isNan(number)) { // The current number is nan. @@ -550,7 +408,29 @@ export const min = (...$s) => { } } return lowest ?? POSITIVE_INFINITY; -}; +}, { + name: defineOwnDataProperty(Object.create(null), "value", "min"), + length: defineOwnDataProperty(Object.create(null), "value", 2), +}); + +/** + * Returns a pseudo·random value in the range [0, 1). + * + * ※ This function is effectively an alias for `Math.random`. + */ +export const rand = createArrowFunction( + Math.random, + { name: "rand" }, +); + +/** + * Returns the round of the provided value. + * + * ※ This function is effectively an alias for `Math.round`. + * + * ☡ This function does not allow big·int arguments. + */ +export const round = createArrowFunction(Math.round); /** * Returns a unit value with the same sign as the provided value, or @@ -582,6 +462,51 @@ export const sgn = ($) => { : 1; }; +/** + * Returns the sin of the provided value. + * + * ※ This function is effectively an alias for `Math.sin`. + * + * ☡ This function does not allow big·int arguments. + */ +export const sin = createArrowFunction(Math.sin); + +/** + * Returns the sinh of the provided value. + * + * ※ This function is effectively an alias for `Math.sinh`. + * + * ☡ This function does not allow big·int arguments. + */ +export const sinh = createArrowFunction(Math.sinh); + +/** + * Returns the square root of the provided value. + * + * ※ This function is effectively an alias for `Math.sqrt`. + * + * ☡ This function does not allow big·int arguments. + */ +export const sqrt = createArrowFunction(Math.sqrt); + +/** + * Returns the tan of the provided value. + * + * ※ This function is effectively an alias for `Math.tan`. + * + * ☡ This function does not allow big·int arguments. + */ +export const tan = createArrowFunction(Math.tan); + +/** + * Returns the tanh of the provided value. + * + * ※ This function is effectively an alias for `Math.tanh`. + * + * ☡ This function does not allow big·int arguments. + */ +export const tanh = createArrowFunction(Math.tanh); + /** * Returns the result of converting the provided value to a big·int. * @@ -634,12 +559,12 @@ export const { return call( numberToExponential, n, - [fractionDigits === undefined ? fractionDigits : f], + [fractionDigits === UNDEFINED ? fractionDigits : f], ); } else { const digits = call(bigintToString, n, [10]); const { length } = digits; - if (fractionDigits === undefined) { + if (fractionDigits === UNDEFINED) { return length === 1 ? `${digits[0]}e+0` : `${digits[0]}.${substring(digits, 1)}e+${length - 1}`; @@ -805,3 +730,12 @@ export const { }, }; })(); + +/** + * Returns the trunc of the provided value. + * + * ※ This function is effectively an alias for `Math.trunc`. + * + * ☡ This function does not allow big·int arguments. + */ +export const trunc = createArrowFunction(Math.trunc);