github.com/gopherjs/gopherjs@v1.19.0-beta1.0.20240506212314-27071a8796e4/compiler/prelude/numeric.js (about)

     1  var $min = Math.min;
     2  var $mod = (x, y) => { return x % y; };
     3  var $parseInt = parseInt;
     4  var $parseFloat = f => {
     5      if (f !== undefined && f !== null && f.constructor === Number) {
     6          return f;
     7      }
     8      return parseFloat(f);
     9  };
    10  
    11  var $froundBuf = new Float32Array(1);
    12  var $fround = Math.fround || (f => {
    13      $froundBuf[0] = f;
    14      return $froundBuf[0];
    15  });
    16  
    17  var $imul = Math.imul || ((a, b) => {
    18      var ah = (a >>> 16) & 0xffff;
    19      var al = a & 0xffff;
    20      var bh = (b >>> 16) & 0xffff;
    21      var bl = b & 0xffff;
    22      return ((al * bl) + (((ah * bl + al * bh) << 16) >>> 0) >> 0);
    23  });
    24  
    25  var $floatKey = f => {
    26      if (f !== f) {
    27          $idCounter++;
    28          return "NaN$" + $idCounter;
    29      }
    30      return String(f);
    31  };
    32  
    33  var $flatten64 = x => {
    34      return x.$high * 4294967296 + x.$low;
    35  };
    36  
    37  var $shiftLeft64 = (x, y) => {
    38      if (y === 0) {
    39          return x;
    40      }
    41      if (y < 32) {
    42          return new x.constructor(x.$high << y | x.$low >>> (32 - y), (x.$low << y) >>> 0);
    43      }
    44      if (y < 64) {
    45          return new x.constructor(x.$low << (y - 32), 0);
    46      }
    47      return new x.constructor(0, 0);
    48  };
    49  
    50  var $shiftRightInt64 = (x, y) => {
    51      if (y === 0) {
    52          return x;
    53      }
    54      if (y < 32) {
    55          return new x.constructor(x.$high >> y, (x.$low >>> y | x.$high << (32 - y)) >>> 0);
    56      }
    57      if (y < 64) {
    58          return new x.constructor(x.$high >> 31, (x.$high >> (y - 32)) >>> 0);
    59      }
    60      if (x.$high < 0) {
    61          return new x.constructor(-1, 4294967295);
    62      }
    63      return new x.constructor(0, 0);
    64  };
    65  
    66  var $shiftRightUint64 = (x, y) => {
    67      if (y === 0) {
    68          return x;
    69      }
    70      if (y < 32) {
    71          return new x.constructor(x.$high >>> y, (x.$low >>> y | x.$high << (32 - y)) >>> 0);
    72      }
    73      if (y < 64) {
    74          return new x.constructor(0, x.$high >>> (y - 32));
    75      }
    76      return new x.constructor(0, 0);
    77  };
    78  
    79  var $mul64 = (x, y) => {
    80      var x48 = x.$high >>> 16;
    81      var x32 = x.$high & 0xFFFF;
    82      var x16 = x.$low >>> 16;
    83      var x00 = x.$low & 0xFFFF;
    84  
    85      var y48 = y.$high >>> 16;
    86      var y32 = y.$high & 0xFFFF;
    87      var y16 = y.$low >>> 16;
    88      var y00 = y.$low & 0xFFFF;
    89  
    90      var z48 = 0, z32 = 0, z16 = 0, z00 = 0;
    91      z00 += x00 * y00;
    92      z16 += z00 >>> 16;
    93      z00 &= 0xFFFF;
    94      z16 += x16 * y00;
    95      z32 += z16 >>> 16;
    96      z16 &= 0xFFFF;
    97      z16 += x00 * y16;
    98      z32 += z16 >>> 16;
    99      z16 &= 0xFFFF;
   100      z32 += x32 * y00;
   101      z48 += z32 >>> 16;
   102      z32 &= 0xFFFF;
   103      z32 += x16 * y16;
   104      z48 += z32 >>> 16;
   105      z32 &= 0xFFFF;
   106      z32 += x00 * y32;
   107      z48 += z32 >>> 16;
   108      z32 &= 0xFFFF;
   109      z48 += x48 * y00 + x32 * y16 + x16 * y32 + x00 * y48;
   110      z48 &= 0xFFFF;
   111  
   112      var hi = ((z48 << 16) | z32) >>> 0;
   113      var lo = ((z16 << 16) | z00) >>> 0;
   114  
   115      var r = new x.constructor(hi, lo);
   116      return r;
   117  };
   118  
   119  var $div64 = (x, y, returnRemainder) => {
   120      if (y.$high === 0 && y.$low === 0) {
   121          $throwRuntimeError("integer divide by zero");
   122      }
   123  
   124      var s = 1;
   125      var rs = 1;
   126  
   127      var xHigh = x.$high;
   128      var xLow = x.$low;
   129      if (xHigh < 0) {
   130          s = -1;
   131          rs = -1;
   132          xHigh = -xHigh;
   133          if (xLow !== 0) {
   134              xHigh--;
   135              xLow = 4294967296 - xLow;
   136          }
   137      }
   138  
   139      var yHigh = y.$high;
   140      var yLow = y.$low;
   141      if (y.$high < 0) {
   142          s *= -1;
   143          yHigh = -yHigh;
   144          if (yLow !== 0) {
   145              yHigh--;
   146              yLow = 4294967296 - yLow;
   147          }
   148      }
   149  
   150      var high = 0, low = 0, n = 0;
   151      while (yHigh < 2147483648 && ((xHigh > yHigh) || (xHigh === yHigh && xLow > yLow))) {
   152          yHigh = (yHigh << 1 | yLow >>> 31) >>> 0;
   153          yLow = (yLow << 1) >>> 0;
   154          n++;
   155      }
   156      for (var i = 0; i <= n; i++) {
   157          high = high << 1 | low >>> 31;
   158          low = (low << 1) >>> 0;
   159          if ((xHigh > yHigh) || (xHigh === yHigh && xLow >= yLow)) {
   160              xHigh = xHigh - yHigh;
   161              xLow = xLow - yLow;
   162              if (xLow < 0) {
   163                  xHigh--;
   164                  xLow += 4294967296;
   165              }
   166              low++;
   167              if (low === 4294967296) {
   168                  high++;
   169                  low = 0;
   170              }
   171          }
   172          yLow = (yLow >>> 1 | yHigh << (32 - 1)) >>> 0;
   173          yHigh = yHigh >>> 1;
   174      }
   175  
   176      if (returnRemainder) {
   177          return new x.constructor(xHigh * rs, xLow * rs);
   178      }
   179      return new x.constructor(high * s, low * s);
   180  };
   181  
   182  var $divComplex = (n, d) => {
   183      var ninf = n.$real === Infinity || n.$real === -Infinity || n.$imag === Infinity || n.$imag === -Infinity;
   184      var dinf = d.$real === Infinity || d.$real === -Infinity || d.$imag === Infinity || d.$imag === -Infinity;
   185      var nnan = !ninf && (n.$real !== n.$real || n.$imag !== n.$imag);
   186      var dnan = !dinf && (d.$real !== d.$real || d.$imag !== d.$imag);
   187      if (nnan || dnan) {
   188          return new n.constructor(NaN, NaN);
   189      }
   190      if (ninf && !dinf) {
   191          return new n.constructor(Infinity, Infinity);
   192      }
   193      if (!ninf && dinf) {
   194          return new n.constructor(0, 0);
   195      }
   196      if (d.$real === 0 && d.$imag === 0) {
   197          if (n.$real === 0 && n.$imag === 0) {
   198              return new n.constructor(NaN, NaN);
   199          }
   200          return new n.constructor(Infinity, Infinity);
   201      }
   202      var a = Math.abs(d.$real);
   203      var b = Math.abs(d.$imag);
   204      if (a <= b) {
   205          var ratio = d.$real / d.$imag;
   206          var denom = d.$real * ratio + d.$imag;
   207          return new n.constructor((n.$real * ratio + n.$imag) / denom, (n.$imag * ratio - n.$real) / denom);
   208      }
   209      var ratio = d.$imag / d.$real;
   210      var denom = d.$imag * ratio + d.$real;
   211      return new n.constructor((n.$imag * ratio + n.$real) / denom, (n.$imag - n.$real * ratio) / denom);
   212  };