class Matrixlpp::Fraccion

Esta clase permite representar números racionales de la forma numerador/denominador.

Public Class Methods

new(x,y) click to toggle source

Los parámetros que se pasan son el numerador y el denominador, respectivamente:

  • x: Numerador.

  • y: Denominador.

# File lib/matrixlpp/racional.rb, line 17
def initialize(x,y)
    raise ArgumentError , 'Argumentos no enteros.' unless x.is_a? Fixnum and y.is_a? Fixnum
    raise ArgumentError , 'Denominador nulo.' unless y != 0

    @num, @den = x, y
    reducir
    #--
    # En caso de ser negativa, la fracción será -a/b, y no a/(-b)
    #++
    if(@num < 0 && @den < 0)
        @num = -@num
        @den = -@den
    elsif(@den < 0)
        @den = -@den
        @num = -@num
    end
end
null() click to toggle source

Devuelve la fracción nula (con valor 0) 0/1.

# File lib/matrixlpp/racional.rb, line 47
def self.null
    Fraccion.new(0,1)
end

Public Instance Methods

%(other) click to toggle source

Permite obtener el resto entre la división de una fracción y otro elemento.

# File lib/matrixlpp/racional.rb, line 141
def %(other) #-- # Operación módulo #++
    raise ArgumentError, 'Argumento no racional' unless other.is_a? Fraccion
    
    Fraccion.new(0,1) #-- # Resto de una división de fracciones = siempre nulo (0/1) #++
end
*(other) click to toggle source

Permite multiplicar otro elemento a una fracción.

# File lib/matrixlpp/racional.rb, line 113
def *(other) #-- # Operación producto #++
    if(other.respond_to? :den and other.respond_to? :num)
      if(@num*other.num == 0)
        Fraccion.null
      else
        Fraccion.new(@num*other.num, @den*other.den) # a/b * c/d = (a*c)/(b*d)
      end
    else
      Fraccion.new(@num*other, @den)  # a/b * c = (a*c)/b
    end
end
+(other) click to toggle source

Permite sumar otro elemento a una fracción.

# File lib/matrixlpp/racional.rb, line 97
def +(other) #-- # Operación suma #++
    if(other.respond_to? :den and other.respond_to? :num)
      Fraccion.new(@num*other.den + @den*other.num, @den*other.den) # a/b + c/d = (a*d + b*c)/(b*d)
    else
      Fraccion.new(@num + @den*other, @den) # a/b + c = (a + b*c)/b
    end
end
-(other) click to toggle source

Permite restar otro elemento a una fracción.

# File lib/matrixlpp/racional.rb, line 105
def -(other) #-- # Operación resta #++
    if(other.respond_to? :den and other.respond_to? :num)
      Fraccion.new(@num*other.den - @den*other.num, @den*other.den) # a/b - c/d = (a*d - b*c)/(b*d)
    else
      Fraccion.new(@num - @den*other, @den) # a/b - c = (a - b*c)/b
    end
end
-@() click to toggle source

Devuelve la fracción con signo negativo.

# File lib/matrixlpp/racional.rb, line 88
def -@ # Operación negación
    Fraccion.new(-@num, @den)
end
/(other) click to toggle source

Permite dividir otro elemento a una fracción.

# File lib/matrixlpp/racional.rb, line 125
def /(other) #-- # Operación división #++
    if(other.respond_to? :den and other.respond_to? :num)
      if(other.num == 0)
        Fraccion.null
      else
        Fraccion.new(@num*other.den, @den*other.num) # a/b / c/d = (a*d)/(b*c)
      end
    else
      if(other == 0)
        Fraccion.null
      else
        Fraccion.new(@num, @den*other)
      end
    end
end
<=>(other) click to toggle source

Este método permite hacer operaciones comparacionales entre una fracción y otro elemento.

# File lib/matrixlpp/racional.rb, line 152
def <=> (other)
    #-- #raise ArgumentError, 'Argumento no racional' unless other.is_a? Fraccion #++
  
    #-- # a/b <=> c/d -> (a*d)/(b*d) <=> (c*b)/(d*b) -> a*d <=> c*b #++
    if(other.respond_to? :den and other.respond_to? :num)
      (@num * other.den) <=> (other.num * @den)
    else
      (@num.to_f / @den.to_f) <=> (other)
    end
end
abs() click to toggle source

Devulve el valor absoluto de una fracción

# File lib/matrixlpp/racional.rb, line 70
def abs
    a, b = @num, @den
    if @num < 0
        a = @num * (-1)
    end
    if @den < 0
        b = @den * (-1)
    end
    Fraccion.new(a.to_i,b.to_i)
end
coerce(other) click to toggle source

Este método permite invertir el orden de los operandos para posibilitar las operaciones aritméticas.

# File lib/matrixlpp/racional.rb, line 43
def coerce(other)
    [Fraccion.new(other,1),self]  
end
den() click to toggle source

Devuelve el valor del denominador.

# File lib/matrixlpp/racional.rb, line 39
def den()
    @den
end
num() click to toggle source

Devuelve el valor del numerador.

# File lib/matrixlpp/racional.rb, line 35
def num()
    @num
end
reciprocal() click to toggle source

Devuelve la fracción recíproca.

# File lib/matrixlpp/racional.rb, line 81
def reciprocal
    aux = @num
    @num = @den
    @den = aux
    Fraccion.new(@num,@den)
end
reducir() click to toggle source

Reduce la fracción a su mínima expresión.

# File lib/matrixlpp/racional.rb, line 55
def reducir
    mcd = Matrixlpp::gcd(@num,@den)
    @num = @num / mcd
    @den = @den / mcd
end
to_f() click to toggle source

Permite usar números en representación de punto flotante en el numerador y en el denominador.

# File lib/matrixlpp/racional.rb, line 61
def to_f
    @num.to_f/@den.to_f
end
to_s() click to toggle source

Devuelve la representación de la fracción como “numerador/denominador”.

# File lib/matrixlpp/racional.rb, line 51
def to_s
    "#{@num}/#{@den}"
end