Slide 113
Slide 113 text
class SignedNumber
# …
def ==(other)
left + other.right == other.left + right
end
def +(other)
SignedNumber.new(left + other.left, right + other.right)
end
def -(other)
SignedNumber.new(left + other.right, other.left + right)
end
def *(other)
SignedNumber.new(
left * other.right + other.left * right,
left * other.left + right * other.right
)
end
def <(other)
other.left + right < left + other.right
end
# …
end
class SignedNumber
# …
def ==(other)
(sign == other.sign || size.zero?) && size == other.size
end
def +(other)
if sign == other.sign
SignedNumber.new(sign, size + other.size)
else
if size >= other.size
SignedNumber.new(sign, size - other.size)
else
SignedNumber.new(
sign == :positive ? :negative : :positive,
other.size - size
)
end
end
end
def -(other)
if sign == other.sign
if size >= other.size
SignedNumber.new(sign, size - other.size)
else
SignedNumber.new(
sign == :positive ? :negative : :positive,
other.size - size
)
end
else
SignedNumber.new(sign, size + other.size)
end
end
def *(other)
if sign == other.sign
SignedNumber.new(:positive, size * other.size)
else
SignedNumber.new(:negative, size * other.size)
end
end
def <(other)
if sign == other.sign
if sign == :positive
size < other.size
else
other.size < size
end
else
sign == :negative && !(size.zero? && other.size.zero?)
end
end
# …
end