Module: Math

Defined in:
opal/opal/corelib/math.rb

Overview

helpers: type_error

Constant Summary collapse

E =
`Math.E`
PI =
`Math.PI`
DomainError =
Class.new(StandardError)

Class Method Summary collapse

Class Method Details

.acos(x) ⇒ Object



39
40
41
# File 'opal/opal/corelib/math.rb', line 39

def acos(x)
  Math.checked :acos, Math.float!(x)
end

.acosh(x) ⇒ Object



51
52
53
# File 'opal/opal/corelib/math.rb', line 51

def acosh(x)
  Math.checked :acosh, Math.float!(x)
end

.asin(x) ⇒ Object



55
56
57
# File 'opal/opal/corelib/math.rb', line 55

def asin(x)
  Math.checked :asin, Math.float!(x)
end

.asinh(x) ⇒ Object



67
68
69
# File 'opal/opal/corelib/math.rb', line 67

def asinh(x)
  Math.checked :asinh, Math.float!(x)
end

.atan(x) ⇒ Object



71
72
73
# File 'opal/opal/corelib/math.rb', line 71

def atan(x)
  Math.checked :atan, Math.float!(x)
end

.atan2(y, x) ⇒ Object



75
76
77
# File 'opal/opal/corelib/math.rb', line 75

def atan2(y, x)
  Math.checked :atan2, Math.float!(y), Math.float!(x)
end

.atanh(x) ⇒ Object



87
88
89
# File 'opal/opal/corelib/math.rb', line 87

def atanh(x)
  Math.checked :atanh, Math.float!(x)
end

.cbrt(x) ⇒ Object



137
138
139
# File 'opal/opal/corelib/math.rb', line 137

def cbrt(x)
  Math.checked :cbrt, Math.float!(x)
end

.checked(method, *args) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# File 'opal/opal/corelib/math.rb', line 9

def self.checked(method, *args)
  %x{
    if (isNaN(args[0]) || (args.length == 2 && isNaN(args[1]))) {
      return NaN;
    }

    var result = Math[method].apply(null, args);

    if (isNaN(result)) {
      #{raise DomainError, "Numerical argument is out of domain - \"#{method}\""};
    }

    return result;
  }
end

.cos(x) ⇒ Object



141
142
143
# File 'opal/opal/corelib/math.rb', line 141

def cos(x)
  Math.checked :cos, Math.float!(x)
end

.cosh(x) ⇒ Object



153
154
155
# File 'opal/opal/corelib/math.rb', line 153

def cosh(x)
  Math.checked :cosh, Math.float!(x)
end

.erf(x) ⇒ Object



183
184
185
# File 'opal/opal/corelib/math.rb', line 183

def erf(x)
  Math.checked :erf, Math.float!(x)
end

.erfc(x) ⇒ Object



216
217
218
# File 'opal/opal/corelib/math.rb', line 216

def erfc(x)
  Math.checked :erfc, Math.float!(x)
end

.exp(x) ⇒ Object



220
221
222
# File 'opal/opal/corelib/math.rb', line 220

def exp(x)
  Math.checked :exp, Math.float!(x)
end

.float!(value) ⇒ Object



25
26
27
28
29
# File 'opal/opal/corelib/math.rb', line 25

def self.float!(value)
  Float(value)
rescue ArgumentError
  raise `$type_error(value, #{Float})`
end

.frexp(x) ⇒ Object



224
225
226
227
228
229
230
231
232
233
234
235
236
237
# File 'opal/opal/corelib/math.rb', line 224

def frexp(x)
  x = Math.float!(x)

  %x{
    if (isNaN(x)) {
      return [NaN, 0];
    }

    var ex   = Math.floor(Math.log(Math.abs(x)) / Math.log(2)) + 1,
        frac = x / Math.pow(2, ex);

    return [frac, ex];
  }
end

.gamma(n) ⇒ Object



239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
# File 'opal/opal/corelib/math.rb', line 239

def gamma(n)
  n = Math.float!(n)

  %x{
    var i, t, x, value, result, twoN, threeN, fourN, fiveN;

    var G = 4.7421875;

    var P = [
       0.99999999999999709182,
       57.156235665862923517,
      -59.597960355475491248,
       14.136097974741747174,
      -0.49191381609762019978,
       0.33994649984811888699e-4,
       0.46523628927048575665e-4,
      -0.98374475304879564677e-4,
       0.15808870322491248884e-3,
      -0.21026444172410488319e-3,
       0.21743961811521264320e-3,
      -0.16431810653676389022e-3,
       0.84418223983852743293e-4,
      -0.26190838401581408670e-4,
       0.36899182659531622704e-5
    ];


    if (isNaN(n)) {
      return NaN;
    }

    if (n === 0 && 1 / n < 0) {
      return -Infinity;
    }

    if (n === -1 || n === -Infinity) {
      #{raise DomainError, 'Numerical argument is out of domain - "gamma"'};
    }

    if (#{Integer === n}) {
      if (n <= 0) {
        return isFinite(n) ? Infinity : NaN;
      }

      if (n > 171) {
        return Infinity;
      }

      value  = n - 2;
      result = n - 1;

      while (value > 1) {
        result *= value;
        value--;
      }

      if (result == 0) {
        result = 1;
      }

      return result;
    }

    if (n < 0.5) {
      return Math.PI / (Math.sin(Math.PI * n) * #{Math.gamma(1 - n)});
    }

    if (n >= 171.35) {
      return Infinity;
    }

    if (n > 85.0) {
      twoN   = n * n;
      threeN = twoN * n;
      fourN  = threeN * n;
      fiveN  = fourN * n;

      return Math.sqrt(2 * Math.PI / n) * Math.pow((n / Math.E), n) *
        (1 + 1 / (12 * n) + 1 / (288 * twoN) - 139 / (51840 * threeN) -
        571 / (2488320 * fourN) + 163879 / (209018880 * fiveN) +
        5246819 / (75246796800 * fiveN * n));
    }

    n -= 1;
    x  = P[0];

    for (i = 1; i < P.length; ++i) {
      x += P[i] / (n + i);
    }

    t = n + G + 0.5;

    return Math.sqrt(2 * Math.PI) * Math.pow(t, n + 0.5) * Math.exp(-t) * x;
  }
end

.hypot(x, y) ⇒ Object



343
344
345
# File 'opal/opal/corelib/math.rb', line 343

def hypot(x, y)
  Math.checked :hypot, Math.float!(x), Math.float!(y)
end

.integer!(value) ⇒ Object



31
32
33
34
35
# File 'opal/opal/corelib/math.rb', line 31

def self.integer!(value)
  Integer(value)
rescue ArgumentError
  raise `$type_error(value, #{Integer})`
end

.ldexp(mantissa, exponent) ⇒ Object



347
348
349
350
351
352
353
354
355
356
357
358
# File 'opal/opal/corelib/math.rb', line 347

def ldexp(mantissa, exponent)
  mantissa = Math.float!(mantissa)
  exponent = Math.integer!(exponent)

  %x{
    if (isNaN(exponent)) {
      #{raise RangeError, 'float NaN out of range of integer'};
    }

    return mantissa * Math.pow(2, exponent);
  }
end

.lgamma(n) ⇒ Object



360
361
362
363
364
365
366
367
368
369
# File 'opal/opal/corelib/math.rb', line 360

def lgamma(n)
  %x{
    if (n == -1) {
      return [Infinity, 1];
    }
    else {
      return [Math.log(Math.abs(#{Math.gamma(n)})), #{Math.gamma(n)} < 0 ? -1 : 1];
    }
  }
end

.log(x, base = undefined) ⇒ Object



371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
# File 'opal/opal/corelib/math.rb', line 371

def log(x, base = undefined)
  if String === x
    raise `$type_error(x, #{Float})`
  end

  if `base == null`
    Math.checked :log, Math.float!(x)
  else
    if String === base
      raise `$type_error(base, #{Float})`
    end

    Math.checked(:log, Math.float!(x)) / Math.checked(:log, Math.float!(base))
  end
end

.log10(x) ⇒ Object



395
396
397
398
399
400
401
# File 'opal/opal/corelib/math.rb', line 395

def log10(x)
  if String === x
    raise `$type_error(x, #{Float})`
  end

  Math.checked :log10, Math.float!(x)
end

.log2(x) ⇒ Object



411
412
413
414
415
416
417
# File 'opal/opal/corelib/math.rb', line 411

def log2(x)
  if String === x
    raise `$type_error(x, #{Float})`
  end

  Math.checked :log2, Math.float!(x)
end

.sin(x) ⇒ Object



419
420
421
# File 'opal/opal/corelib/math.rb', line 419

def sin(x)
  Math.checked :sin, Math.float!(x)
end

.sinh(x) ⇒ Object



431
432
433
# File 'opal/opal/corelib/math.rb', line 431

def sinh(x)
  Math.checked :sinh, Math.float!(x)
end

.sqrt(x) ⇒ Object



435
436
437
# File 'opal/opal/corelib/math.rb', line 435

def sqrt(x)
  Math.checked :sqrt, Math.float!(x)
end

.tan(x) ⇒ Object



439
440
441
442
443
444
445
446
447
# File 'opal/opal/corelib/math.rb', line 439

def tan(x)
  x = Math.float!(x)

  if x.infinite?
    return Float::NAN
  end

  Math.checked :tan, Math.float!(x)
end

.tanh(x) ⇒ Object



465
466
467
# File 'opal/opal/corelib/math.rb', line 465

def tanh(x)
  Math.checked :tanh, Math.float!(x)
end