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