Module: Dydx::Algebra::Set

Included in:
Dydx::Algebra
Defined in:
lib/dydx/algebra/set.rb

Defined Under Namespace

Modules: Base Classes: Cos, E, Log, Log10, Log2, Num, Pi, Sin, Tan

Instance Method Summary collapse

Instance Method Details

#cos(x) ⇒ Object



291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
# File 'lib/dydx/algebra/set.rb', line 291

def cos(x)
  return Cos.new(x) unless x.multiple_of?(pi) && (x / pi).num?

  radn = (x / pi)
  loop do
    break if radn < 2
    radn -= 2
  end

  case radn
  when 0        then 1
  when _(1) / 2 then 0
  when 1        then -1
  when _(3) / 2 then 0
  else               Cos.new(x)
  end
end

#eObject



209
210
211
# File 'lib/dydx/algebra/set.rb', line 209

def e
  $e ||= E.new
end

#e0Object



197
198
199
# File 'lib/dydx/algebra/set.rb', line 197

def e0
  eval('$e0 ||= _(0)')
end

#e1Object



201
202
203
# File 'lib/dydx/algebra/set.rb', line 201

def e1
  eval('$e1 ||= _(1)')
end

#log(formula) ⇒ Object

TODO: Method has too many lines. [13/10]



218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
# File 'lib/dydx/algebra/set.rb', line 218

def log(formula)
  if formula.formula?(:*)
    f, g = formula.f, formula.g
    log(f) + log(g)
  elsif formula.formula?(:**)
    f, g = formula.f, formula.g
    g * log(f)
  elsif formula.one?
    e0
  elsif formula.is_a?(E)
    e1
  else
    Log.new(formula)
  end
end

#log10(formula) ⇒ Object



253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
# File 'lib/dydx/algebra/set.rb', line 253

def log10(formula)
  # TODO: refactor with log function.
  if formula.formula?(:*)
    f, g = formula.f, formula.g
    log10(f) + log10(g)
  elsif formula.formula?(:**)
    f, g = formula.f, formula.g
    g * log10(f)
  elsif formula.one?
    e0
  elsif formula.is_a?(Num)
    (formula.n == 10) ? e1 : log10(formula.n)
  elsif formula == 10
    e1
  else
    Log10.new(formula)
  end
end

#log2(formula) ⇒ Object



234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
# File 'lib/dydx/algebra/set.rb', line 234

def log2(formula)
  # TODO: refactor with log function.
  if formula.formula?(:*)
    f, g = formula.f, formula.g
    log2(f) + log2(g)
  elsif formula.formula?(:**)
    f, g = formula.f, formula.g
    g * log2(f)
  elsif formula.one?
    e0
  elsif formula.is_a?(Num)
    (formula.n == 2) ? e1 : log2(formula.n)
  elsif formula == 2
    e1
  else
    Log2.new(formula)
  end
end

#ooObject



213
214
215
# File 'lib/dydx/algebra/set.rb', line 213

def oo
  Float::INFINITY
end

#piObject



205
206
207
# File 'lib/dydx/algebra/set.rb', line 205

def pi
  $pi ||= Pi.new
end

#sin(x) ⇒ Object

TODO: We should negative num



273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
# File 'lib/dydx/algebra/set.rb', line 273

def sin(x)
  return Sin.new(x) unless x.multiple_of?(pi) && (x / pi).num?

  radn = (x / pi)
  loop do
    break if radn < 2
    radn -= 2
  end

  case radn
  when 0        then 0
  when _(1) / 2 then 1
  when 1        then 0
  when _(3) / 2 then -1
  else               Sin.new(x)
  end
end

#tan(x) ⇒ Object



309
310
311
312
313
314
315
# File 'lib/dydx/algebra/set.rb', line 309

def tan(x)
  if x == 0
    0
  else
    Tan.new(x)
  end
end