class Rubic::Builtin::Number

Public Instance Methods

*(*args) click to toggle source
# File lib/rubic/builtin/number.rb, line 24
def *(*args)
  transitive_operation('*', 1, args) {|a, b| a * b }
end
+(*args) click to toggle source
# File lib/rubic/builtin/number.rb, line 9
def +(*args)
  transitive_operation('+', 0, args) {|a, b| a + b }
end
-(*args) click to toggle source
# File lib/rubic/builtin/number.rb, line 13
def -(*args)
  case args.size
  when 0
    raise Rubic::ArgumentError, "wrong number of arguments (0 for 1+)"
  when 1
    -args.first
  else
    transitive_operation('-', args) {|a, b| a - b }
  end
end
/(*args) click to toggle source
# File lib/rubic/builtin/number.rb, line 28
def /(*args)
  case args.size
  when 0
    raise Rubic::ArgumentError, "wrong number of arguments (0 for 1+)"
  when 1
    1.quo(args.first)
  else
    transitive_operation('/', args) {|a, b| a.quo(b) }
  end
end
<(*args) click to toggle source
# File lib/rubic/builtin/number.rb, line 61
def <(*args)
  if args.size < 2
    raise Rubic::ArgumentError, "wrong number of arguments (#{args.size} for 2+)"
  else
    transitive_operation('<', args) do |a, b|
      (a < b) ? b : (return false)
    end
    true
  end
end
<=(*args) click to toggle source
# File lib/rubic/builtin/number.rb, line 83
def <=(*args)
  if args.size < 2
    raise Rubic::ArgumentError, "wrong number of arguments (#{args.size} for 2+)"
  else
    transitive_operation('<=', args) do |a, b|
      (a <= b) ? b : (return false)
    end
    true
  end
end
>(*args) click to toggle source
# File lib/rubic/builtin/number.rb, line 50
def >(*args)
  if args.size < 2
    raise Rubic::ArgumentError, "wrong number of arguments (#{args.size} for 2+)"
  else
    transitive_operation('>', args) do |a, b|
      (a > b) ? b : (return false)
    end
    true
  end
end
>=(*args) click to toggle source
# File lib/rubic/builtin/number.rb, line 72
def >=(*args)
  if args.size < 2
    raise Rubic::ArgumentError, "wrong number of arguments (#{args.size} for 2+)"
  else
    transitive_operation('>=', args) do |a, b|
      (a >= b) ? b : (return false)
    end
    true
  end
end
abs(num) click to toggle source
# File lib/rubic/builtin/number.rb, line 180
def abs(num)
  ensure_number num
  num.abs
end
acos(num) click to toggle source
# File lib/rubic/builtin/number.rb, line 290
def acos(num)
  ensure_number num
  CMath.acos(num)
end
angle(num) click to toggle source
# File lib/rubic/builtin/number.rb, line 343
def angle(num)
  ensure_number num
  num.angle
end
asin(num) click to toggle source
# File lib/rubic/builtin/number.rb, line 285
def asin(num)
  ensure_number num
  CMath.asin(num)
end
atan(*args) click to toggle source
# File lib/rubic/builtin/number.rb, line 295
def atan(*args)
  case args.size
  when 1
    ensure_number args[0]
    CMath.atan(args[0])
  when 2
    ensure_number args[0], args[1]
    Complex(args[1], args[0]).angle
  else
    raise Rubic::ArgumentError, "wrong number of arguments (#{args.size} for 1..2)"
  end
end
ceiling(num) click to toggle source
# File lib/rubic/builtin/number.rb, line 240
def ceiling(num)
  ensure_real num
  num.ceil
end
complex?(suspect) click to toggle source
# File lib/rubic/builtin/number.rb, line 98
def complex?(suspect)
  suspect.is_a?(Complex) || real?(suspect)
end
cos(num) click to toggle source
# File lib/rubic/builtin/number.rb, line 275
def cos(num)
  ensure_number num
  CMath.cos(num)
end
denominator(num) click to toggle source
# File lib/rubic/builtin/number.rb, line 229
def denominator(num)
  ensure_real num
  ret = num.to_r.denominator
  exact?(num) ? ret : exact_to_inexact(ret)
end
even?(suspect) click to toggle source
# File lib/rubic/builtin/number.rb, line 157
def even?(suspect)
  ensure_integer suspect
  suspect.to_i.even?
end
exact?(suspect) click to toggle source
# File lib/rubic/builtin/number.rb, line 118
def exact?(suspect)
  case suspect
  when Complex
    exact?(suspect.real) && exact?(suspect.imag)
  when Float
    false
  when Rational
    true
  when Integer
    true
  else
    false
  end
end
exp(num) click to toggle source
# File lib/rubic/builtin/number.rb, line 260
def exp(num)
  ensure_number num
  CMath.exp(num)
end
expt(x, y) click to toggle source
# File lib/rubic/builtin/number.rb, line 313
def expt(x, y)
  ensure_number x, y
  x ** y
end
floor(num) click to toggle source
# File lib/rubic/builtin/number.rb, line 235
def floor(num)
  ensure_real num
  num.floor
end
gcd(*args) click to toggle source
# File lib/rubic/builtin/number.rb, line 203
def gcd(*args)
  exact = true
  ret = args.reduce(0) do |res, num|
    ensure_integer num
    exact &&= exact?(num)
    res.gcd(num.to_i)
  end
  exact ? ret : exact_to_inexact(ret)
end
inexact?(suspect) click to toggle source
# File lib/rubic/builtin/number.rb, line 133
def inexact?(suspect)
  number?(suspect) && !exact?(suspect)
end
integer?(suspect) click to toggle source
# File lib/rubic/builtin/number.rb, line 110
def integer?(suspect)
  if suspect.is_a?(Float)
    suspect == suspect.truncate # X.0
  else
    suspect.is_a?(Integer)
  end
end
lcm(*args) click to toggle source
# File lib/rubic/builtin/number.rb, line 213
def lcm(*args)
  exact = true
  ret = args.reduce(1) do |res, num|
    ensure_integer num
    exact &&= exact?(num)
    res.lcm(num.to_i)
  end
  exact ? ret : exact_to_inexact(ret)
end
log(num) click to toggle source
# File lib/rubic/builtin/number.rb, line 265
def log(num)
  ensure_number num
  CMath.log(num)
end
magnitude(num) click to toggle source
# File lib/rubic/builtin/number.rb, line 338
def magnitude(num)
  ensure_number num
  num.magnitude
end
max(a, *args) click to toggle source
# File lib/rubic/builtin/number.rb, line 162
def max(a, *args)
  args.unshift(a)
  exact = args.all? do |e|
    ensure_real e
    exact?(e)
  end
  exact ? args.max : exact_to_inexact(args.max)
end
min(a, *args) click to toggle source
# File lib/rubic/builtin/number.rb, line 171
def min(a, *args)
  args.unshift(a)
  exact = args.all? do |e|
    ensure_real e
    exact?(e)
  end
  exact ? args.min : exact_to_inexact(args.min)
end
modulo(a, b) click to toggle source
# File lib/rubic/builtin/number.rb, line 191
def modulo(a, b)
  ensure_integer a, b
  ret = a.modulo(b)
  exact?(a) && exact?(b) ? ret : exact_to_inexact(ret)
end
negative?(suspect) click to toggle source
# File lib/rubic/builtin/number.rb, line 147
def negative?(suspect)
  ensure_real suspect
  suspect < 0.0
end
number?(suspect) click to toggle source
# File lib/rubic/builtin/number.rb, line 94
def number?(suspect)
  suspect.is_a?(Numeric) || complex?(suspect)
end
numerator(num) click to toggle source
# File lib/rubic/builtin/number.rb, line 223
def numerator(num)
  ensure_real num
  ret = num.to_r.numerator
  exact?(num) ? ret : exact_to_inexact(ret)
end
odd?(suspect) click to toggle source
# File lib/rubic/builtin/number.rb, line 152
def odd?(suspect)
  ensure_integer suspect
  suspect.to_i.odd?
end
positive?(suspect) click to toggle source
# File lib/rubic/builtin/number.rb, line 142
def positive?(suspect)
  ensure_real suspect
  suspect > 0.0
end
quotient(a, b) click to toggle source
# File lib/rubic/builtin/number.rb, line 185
def quotient(a, b)
  ensure_integer a, b
  ret = a.quo(b).round
  exact?(a) && exact?(b) ? ret : exact_to_inexact(ret)
end
rational?(suspect) click to toggle source
# File lib/rubic/builtin/number.rb, line 106
def rational?(suspect)
  suspect.is_a?(Rational) || integer?(suspect)
end
rationalize(num, eps) click to toggle source
# File lib/rubic/builtin/number.rb, line 255
def rationalize(num, eps)
  ensure_real num
  normalize_number num.rationalize(eps)
end
real?(suspect) click to toggle source
# File lib/rubic/builtin/number.rb, line 102
def real?(suspect)
  suspect.is_a?(Float) || rational?(suspect)
end
remainder(a, b) click to toggle source
# File lib/rubic/builtin/number.rb, line 197
def remainder(a, b)
  ensure_integer a, b
  ret = a.remainder(b)
  exact?(a) && exact?(b) ? ret : exact_to_inexact(ret)
end
round(num) click to toggle source
# File lib/rubic/builtin/number.rb, line 250
def round(num)
  ensure_real num
  num.round
end
sin(num) click to toggle source
# File lib/rubic/builtin/number.rb, line 270
def sin(num)
  ensure_number num
  CMath.sin(num)
end
sqrt(num) click to toggle source
# File lib/rubic/builtin/number.rb, line 308
def sqrt(num)
  ensure_number num
  CMath.sqrt(num)
end
tan(num) click to toggle source
# File lib/rubic/builtin/number.rb, line 280
def tan(num)
  ensure_number num
  CMath.tan(num)
end
truncate(num) click to toggle source
# File lib/rubic/builtin/number.rb, line 245
def truncate(num)
  ensure_real num
  num.truncate
end
zero?(suspect) click to toggle source
# File lib/rubic/builtin/number.rb, line 137
def zero?(suspect)
  ensure_number suspect
  suspect.zero?
end

Private Instance Methods

ensure_integer(*args) click to toggle source
# File lib/rubic/builtin/number.rb, line 384
def ensure_integer(*args)
  args.each do |e|
    raise Rubic::TypeError, "`#{e}' is not an integer" unless integer?(e)
  end
end
ensure_number(*args) click to toggle source
# File lib/rubic/builtin/number.rb, line 372
def ensure_number(*args)
  args.each do |e|
    raise Rubic::TypeError, "`#{e}' is not a number" unless number?(e)
  end
end
ensure_real(*args) click to toggle source
# File lib/rubic/builtin/number.rb, line 378
def ensure_real(*args)
  args.each do |e|
    raise Rubic::TypeError, "`#{e}' is not a real number" unless real?(e)
  end
end
transitive_operation(opname, initial=nil, args) { |res, num| ... } click to toggle source
# File lib/rubic/builtin/number.rb, line 362
def transitive_operation(opname, initial=nil, args)
  initial = args.shift if initial.nil?
  args.reduce(initial) do |res, num|
    unless number?(num)
      raise Rubic::TypeError, "operation `#{opname}' is not defined between `#{res}' and `#{num}'"
    end
    yield res, num
  end
end