Ich habe zwei Werte TL und FTL, beide vom Typ Word.
TL ist im Bereich 1 bis $7FFF.
FTL ist im Bereich 400 bis 1200.
Gesucht ist ein Bruch, für den gilt:
FTL * Nominator div Denominator = TL (bzw. möglichst nahe bei TL)
Eine Nebenbedingung ist, dass Nominator und Denominator im Bereich 1 bis 255 (Bytes) liegen müssen.
Ich verwende z.Zt- die nachstehende Funktion.
Weiß jemand einen eleganteren Weg?
Delphi-Quellcode:
PROCEDURE GetFraction(FTL,TL:Word; var Numerator,Denominator:Byte);
var M,N,Delta,BestDelta:Integer; BestNumerator,BestDenominator:Byte; Ratio:Double;
begin
M:=Max(TL,FTL);
BestDelta:=MaxInt;
for N:=245 to 255 do begin
Ratio:=N/M;
Numerator:=Round(TL*Ratio);
Denominator:=Round(FTL*Ratio);
Delta:=Abs(TL-FTL*Numerator div Denominator);
if Delta=0 then Exit;
if Delta<BestDelta then begin
BestDelta:=Delta;
BestNumerator:=Numerator;
BestDenominator:=Denominator;
end;
end;
Numerator:=BestNumerator;
Denominator:=BestDenominator;
end;