Module:Rational: Difference between revisions
mNo edit summary |
m hz() implemented |
||
Line 1,050: | Line 1,050: | ||
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 | end | ||
Line 1,057: | Line 1,078: | ||
a = p.new(a) | a = p.new(a) | ||
end | end | ||
if a.nan or a.inf or a.zero | if a.nan or a.inf or a.zero or a.sign < 0 then | ||
return nil | return nil | ||
end | end |