How to get the Least common multiple of a fractional number

조회 수: 34 (최근 30일)
Tristan
Tristan 2013년 11월 13일
답변: Martin Grden 2024년 3월 1일
for example:
>> lcm(8,20)
ans =
40
works
>> lcm(1.6,1)
doesn't work :(

답변 (4개)

Walter Roberson
Walter Roberson 2013년 11월 13일
rat(1/1.6)
and take the denominator term.

Kaixiang Wang
Kaixiang Wang 2015년 8월 23일
Inspired by one of the comments, actually you could do this with Symbolic toolbox.
x=sym(1.6);
y=sym(1);
lcm(x,y) % should give you the answer you want
  댓글 수: 2
Xiangming Hao
Xiangming Hao 2017년 5월 17일
It works, thank you!
Walter Roberson
Walter Roberson 2017년 5월 17일
Yes, sym() of a double precision value by default tries to represent the value as a rational value, looking for a good approximation -- for example it is able to figure out pi/2 as a multiple of sym('pi') . And once you have rational form then you can proceed towards lcm()

댓글을 달려면 로그인하십시오.


John D'Errico
John D'Errico 2013년 11월 13일
편집: John D'Errico 2013년 11월 13일
Actually, no, you cannot get that result.
The real problem is that MATLAB does not actually represent 1.6 as 1.6. Using my HPF tool, we find that 1.6 is actually stored as
hpf(1.6,60)
ans =
1.60000000000000008881784197001252323389053344726562500000000
Yep. Not exactly 1.6. Floating point storage in a binary form prevents storing most decimal numbers exactly.
In turn, this means that any algorithm that yields a LCM that works on integers will fail when looking for exact multiples of real numbers.

Martin Grden
Martin Grden 2024년 3월 1일
A solution for more than two numbers. You need to split the fractions into two input vectors.
function result=lcm_e(numeratorVector,denominatorVector)
% horiz. vector args req.
z=denominatorVector;
if length(z)==2
lcmDenominatorVector=lcm(z(1),z(2));
else
lcmDenominatorVector=lcm(z(1), ilcm_e(z(2:end)));
end
z=(lcmDenominatorVector./denominatorVector).*numeratorVector;
if length(z)==2
lcmNumeratorVector=lcm(z(1),z(2));
else
lcmNumeratorVector=lcm(z(1), ilcm_e(z(2:end)));
end
result=lcmNumeratorVector/gcd(lcmNumeratorVector,lcmDenominatorVector);
function ierg=ilcm_e(z)
if length(z)==2
ierg=lcm(z(1),z(2));
else
ierg=lcm(z(1),ilcm_e(z(2:end)));
end
end
end

카테고리

Help CenterFile Exchange에서 Symbolic Math Toolbox에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by