stdlib/math/functions.rb

tests/_examples/stdlib/math/functions.rb in the metorex repository.

# Math's functions are module functions, so both `Math.sqrt` and a private
# `sqrt` inside a class that includes Math reach the same one.
p Math.sqrt 4
p Math.cbrt 27
p Math.hypot 3, 4
p Math.log 1
p Math.log 8, 2
p Math.log2 8
p Math.log10 1000
p Math.exp 0
p Math.frexp 1234
p Math.ldexp 0.6025390625, 11

class Distance
  include Math

  def initialize(x, y)
    @x = x
    @y = y
  end

  def length
    sqrt(@x * @x + @y * @y)
  end
end

p Distance.new(3, 4).length
p Math.private_instance_methods.include? :sqrt

# A logarithm of a number too wide for a Float keeps the digits the Float
# cannot hold.
p Math.log2(2 ** 10001)

# An argument outside a function's domain, and one that is not a number at
# all, are each refused.
begin
  Math.sqrt -1
rescue Math::DomainError => error
  puts error.message
end

begin
  Math.sqrt "four"
rescue TypeError => error
  puts error.message
end

p Math.sqrt(0.0 / 0.0).nan?

Output:

2.0
3.0
5.0
0.0
3.0
3.0
3.0
1.0
[0.6025390625, 11]
1234.0
5.0
true
10001.0
Numerical argument is out of domain - "sqrt"
can't convert String into Float
true