Module:Rational: Difference between revisions

Re-comment some functions; implement log base 2 from module: Utils
Sorting functions
Line 923: Line 923:
end
end
return logarithm
return logarithm
end
-- convert a rational number to its size in cents
function p.cents(a)
if type(a) == 'number' then
a = p.new(a)
end
if a.nan or a.inf or a.zero or a.sign < 0 then
return nil
end
local c = 0
for factor, power in pairs(a) do
if type(factor) == 'number' then
c = c + power * u._log(factor, base)
end
end
return c * 1200
end
-- convert a rational number (interpreted as an interval) into Hz
function p.hz(a, base)
base = base or 440
if type(a) == 'number' then
a = p.new(a)
end
if a.nan or a.inf or a.sign < 0 then
return nil
end
if a.zero then
return 0
end
local log_hz = math.log(base)
for factor, power in pairs(a) do
if type(factor) == 'number' then
log_hz = log_hz + power * math.log(factor)
end
end
return math.exp(log_hz)
end
end


Line 1,172: Line 1,210:
end
end
return n_factors <= 1 and m_factors <= 1
return n_factors <= 1 and m_factors <= 1
end
-- convert a rational number (interpreted as an interval) into Hz
function p.hz(a, base)
base = base or 440
if type(a) == 'number' then
a = p.new(a)
end
if a.nan or a.inf or a.sign < 0 then
return nil
end
if a.zero then
return 0
end
local log_hz = math.log(base)
for factor, power in pairs(a) do
if type(factor) == 'number' then
log_hz = log_hz + power * math.log(factor)
end
end
return math.exp(log_hz)
end
-- convert a rational number to its size in cents
function p.cents(a)
if type(a) == 'number' then
a = p.new(a)
end
if a.nan or a.inf or a.zero or a.sign < 0 then
return nil
end
local c = 0
for factor, power in pairs(a) do
if type(factor) == 'number' then
c = c + power * u._log(factor, base)
end
end
return c * 1200
end
end