export declare namespace JSMath { export const E: f64; export const LN2: f64; export const LN10: f64; export const LOG2E: f64; export const LOG10E: f64; export const PI: f64; export const SQRT1_2: f64; export const SQRT2: f64; export function abs(x: f64): f64; export function acos(x: f64): f64; export function acosh(x: f64): f64; export function asin(x: f64): f64; export function asinh(x: f64): f64; export function atan(x: f64): f64; export function atan2(y: f64, x: f64): f64; export function atanh(x: f64): f64; export function cbrt(x: f64): f64; export function ceil(x: f64): f64; export function clz32(x: f64): i32; export function cos(x: f64): f64; export function cosh(x: f64): f64; export function exp(x: f64): f64; export function expm1(x: f64): f64; export function floor(x: f64): f64; export function fround(x: f64): f32; export function hypot(value1: f64, value2: f64): f64; // hypot(...values: f64[]): f64; export function imul(a: f64, b: f64): i32; export function log(x: f64): f64; export function log10(x: f64): f64; export function log1p(x: f64): f64; export function log2(x: f64): f64; export function max(value1: f64, value2: f64): f64; // max(...values: f64[]): f64; export function min(value1: f64, value2: f64): f64; // min(...values: f64[]): f64; export function pow(base: f64, exponent: f64): f64; export function random(): f64; export function round(x: f64): f64; export function sign(x: f64): f64; export function sin(x: f64): f64; export function sinh(x: f64): f64; export function sqrt(x: f64): f64; export function tan(x: f64): f64; export function tanh(x: f64): f64; export function trunc(x: f64): f64; } import { abs as builtin_abs, ceil as builtin_ceil, clz as builtin_clz, floor as builtin_floor, max as builtin_max, min as builtin_min, nearest as builtin_nearest, sqrt as builtin_sqrt, trunc as builtin_trunc } from "./builtins"; export namespace Math { export const E = 2.7182818284590452354; export const LN2 = 0.69314718055994530942; export const LN10 = 2.30258509299404568402; export const LOG2E = 1.4426950408889634074; export const LOG10E = 0.43429448190325182765; export const PI = 3.14159265358979323846; export const SQRT1_2 = 0.70710678118654752440; export const SQRT2 = 1.41421356237309504880; export function abs(x: f64): f64 { return builtin_abs(x); } export function ceil(x: f64): f64 { return builtin_ceil(x); } export function clz32(x: f64): i32 { return builtin_clz(x); } export function floor(x: f64): f64 { return builtin_floor(x); } export function fround(x: f64): f32 { return x; } export function imul(x: f64, y: f64): i32 { return x * y; } export function log(x: f64): f64 { // based on musl's implementation of log: // Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. // Developed at SunPro, a Sun Microsystems, Inc. business. // Permission to use, copy, modify, and distribute this // software is freely granted, provided that this notice // is preserved. const ln2_hi = 6.93147180369123816490e-01, // 3fe62e42 fee00000 ln2_lo = 1.90821492927058770002e-10, // 3dea39ef 35793c76 Lg1 = 6.666666666666735130e-01, // 3FE55555 55555593 Lg2 = 3.999999999940941908e-01, // 3FD99999 9997FA04 Lg3 = 2.857142874366239149e-01, // 3FD24924 94229359 Lg4 = 2.222219843214978396e-01, // 3FCC71C5 1D8E78AF Lg5 = 1.818357216161805012e-01, // 3FC74664 96CB03DE Lg6 = 1.531383769920937332e-01, // 3FC39A09 D078C69F Lg7 = 1.479819860511658591e-01; // 3FC2F112 DF3E5244 var Ux = reinterpret(x); var hx = (Ux >> 32); var k = 0; if (hx < 0x00100000 || (hx >> 31)) { if (Ux << 1 == 0) return -1 / (x * x); // log(+-0)=-inf if (hx >> 31) return (x - x) / 0.0; // log(-#) = NaN // subnormal number, scale x up k -= 54; x *= 1.8014398509481984e16; // 0x1p54 Ux = reinterpret(x); hx = (Ux >> 32); } else if (hx >= 0x7ff00000) return x; else if (hx == 0x3ff00000 && Ux << 32 == 0) return 0; // reduce x into [sqrt(2)/2, sqrt(2)] hx += 0x3ff00000 - 0x3fe6a09e; k += (hx >> 20) - 0x3ff; hx = (hx & 0x000fffff) + 0x3fe6a09e; Ux = hx << 32 | (Ux & 0xffffffff); x = reinterpret(Ux); var f = x - 1.0; var hfsq = 0.5 * f * f; var s = f / (2.0 + f); var z = s * s; var w = z * z; var t1 = w * (Lg2 + w * (Lg4 + w * Lg6)); var t2 = z * (Lg1 + w * (Lg3 + w * (Lg5 + w * Lg7))); var R = t2 + t1; var dk = k; return s * (hfsq + R) + dk * ln2_lo - hfsq + f + dk * ln2_hi; } // export function log2(x: f64): f64 { // return log(x) / LN2; // } // export function log10(x: f64): f64 { // return log(x) / LN10; // } export function max(value1: f64, value2: f64): f64 { return builtin_max(value1, value2); } export function min(value1: f64, value2: f64): f64 { return builtin_min(value1, value2); } export function round(x: f64): f64 { return builtin_nearest(x); } export function sign(x: f64): f64 { return x > 0 ? 1 : x < 0 ? -1 : x; } export function sqrt(x: f64): f64 { return builtin_sqrt(x); } export function trunc(x: f64): f64 { return builtin_trunc(x); } } export namespace Mathf { export const E = Math.E; export const LN2 = Math.LN2; export const LN10 = Math.LN10; export const LOG2E = Math.LOG2E; export const LOG10E = Math.LOG10E; export const PI = Math.PI; export const SQRT1_2 = Math.SQRT1_2; export const SQRT2 = Math.SQRT2; export function abs(x: f32): f32 { return builtin_abs(x); } export function ceil(x: f32): f32 { return builtin_ceil(x); } export function clz32(x: f32): i32 { return builtin_clz(x); } export function floor(x: f32): f32 { return builtin_floor(x); } export function imul(x: f32, y: f32): i32 { return x * y; } export function log(x: f32): f32 { // based on musl's implementaion of logf: // Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. // Developed at SunPro, a Sun Microsystems, Inc. business. // Permission to use, copy, modify, and distribute this // software is freely granted, provided that this notice // is preserved. const ln2_hi = 6.9313812256e-01, // 0x3f317180 ln2_lo = 9.0580006145e-06, // 0x3717f7d1 Lg1 = 0.66666662693, // 0xaaaaaa.0p-24 Lg2 = 0.40000972152, // 0xccce13.0p-25 Lg3 = 0.28498786688, // 0x91e9ee.0p-25 Lg4 = 0.24279078841; // 0xf89e26.0p-26 var ux = reinterpret(x); var k = 0; if (ux < 0x00800000 || (ux >> 31)) { // x < 2**-126 if (ux << 1 == 0) return -1 / (x * x); // log(+-0)=-inf if (ux >> 31) return (x - x) / 0; // log(-#) = NaN // subnormal number, scale up x k -= 25; x *= 3.3554432; // 0x1p25f; ux = reinterpret(x); } else if (ux >= 0x7f800000) return x; else if (ux == 0x3f800000) return 0; // reduce x into [sqrt(2)/2, sqrt(2)] ux += 0x3f800000 - 0x3f3504f3; k += (ux >> 23) - 0x7f; ux = (ux & 0x007fffff) + 0x3f3504f3; x = reinterpret(ux); var f = x - 1.0; var s = f / (2.0 + f); var z = s * s; var w = z * z; var t1 = w * (Lg2 + w * Lg4); var t2 = z * (Lg1 + w * Lg3); var R = t2 + t1; var hfsq = 0.5 * f * f; var dk = k; return s * (hfsq + R) + dk * ln2_lo - hfsq + f + dk * ln2_hi; } // export function log2(x: f32): f32 { // return log(x) / LN2; // } // export function log10(x: f32): f32 { // return log(x) / LN10; // } export function max(value1: f32, value2: f32): f32 { return builtin_max(value1, value2); } export function min(value1: f32, value2: f32): f32 { return builtin_min(value1, value2); } export function round(x: f32): f32 { return builtin_nearest(x); } export function sign(x: f32): f32 { return x > 0 ? 1 : x < 0 ? -1 : x; } export function sqrt(x: f32): f32 { return builtin_sqrt(x); } export function trunc(x: f32): f32 { return builtin_trunc(x); } }