AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Bruch ermitteln

Ein Thema von Amateurprofi · begonnen am 30. Sep 2018 · letzter Beitrag vom 4. Okt 2018
Antwort Antwort
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.087 Beiträge
 
Delphi XE2 Professional
 
#1

Bruch ermitteln

  Alt 30. Sep 2018, 15:56
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;
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Bruch ermitteln

  Alt 30. Sep 2018, 19:02
Ich vermute da fehlen noch ein paar Bedingungen,
wenn Du zb (400*N)div DN=1 hast, dann müßtest Du N=1 und DN=400 setzen.
Das ist mit 1..255 nicht zu realisieren.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.087 Beiträge
 
Delphi XE2 Professional
 
#3

AW: Bruch ermitteln

  Alt 30. Sep 2018, 20:44
Ich vermute da fehlen noch ein paar Bedingungen,
wenn Du zb (400*N)div DN=1 hast, dann müßtest Du N=1 und DN=400 setzen.
Das ist mit 1..255 nicht zu realisieren.

Gruß
K-H
Du irrst.
Grundsätzlich hast du insofern Recht, dass keine exakten Resultate möglich sind.
Jedoch sind exakte Resultate auch nicht gefragt.

Ich schrieb
Zitat:
Gesucht ist ein Bruch, für den gilt:
FTL * Nominator div Denominator = TL (bzw. möglichst nahe bei TL)
Die Betonung liegt auf "möglichst nahe bei TL".

"Du irrst" schrieb ich, weil gerade bei dem von dir genannten Beispiel das Resultat exakt ist.
Zitat:
wenn Du zb (400*N)div DN=1 hast, dann müßtest Du N=1 und DN=400 setzen
Nein!
FTL=400, TL=1, N=1, DN=255
Da ergibt FTL * N div DN = 400 * 1 div 255 = 1, also exakt.


Die größte Abweichung die bei den von mir genannten Bereichen (FTL= 400..1200 und TL = 1..32767) und der Funktion GetFraction so wie sie ist, erscheint bei folgenden Werten:
FTL=450, TL= 32718, Bruch= 255/4, Abweichung = 4031

Lasse ich in der Funktion GetFraction die Schleife von 100 bis 255 laufen, erscheint die größte Abweichung bei den Werten:
FTL=510, TL= 32725, Bruch= 128/2, Abweichung = 85

Dummerweise habe ich in #1 die theoretischen Min/Max Werte für TL genannt.
In der Praxis liegt TL immer im Bereich 25 bis 2400.
Und dann liegt die maximale Abweichung bei den Werten:
FTL=400, TL= 2385, Bruch= 245/41, Abweichung = 5,
Und diese Abweichung ist für mich OK.
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#4

AW: Bruch ermitteln

  Alt 30. Sep 2018, 22:59
Ich habe früher mal was mit Kettenbrüchen gemacht. Das geht dann zwar eher auf Kommazahlen ist aber recht gut im Annähern.

Dann kommt bei deinen drei Beispielen das raus:

FTL=450, TL= 32718, Bruch= 218/3 ==> 450*218/3 = 32700

FTL=510, TL= 32725, Bruch= 64/1 oder 193/3 ==> 450*64/1 = 32640 bzw. 450*193/3 = 32810

FTL=400, TL= 2385, Bruch= 161/27 ==> 400*161/27 = 2385,18

Verfahren hier: https://www.delphipraxis.net/35253-a...s-bruches.html
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.087 Beiträge
 
Delphi XE2 Professional
 
#5

AW: Bruch ermitteln

  Alt 30. Sep 2018, 23:43
@jfheins:
Das scheint genau das zu sein, was ich suche.
Ich werde das in den nächsten Tagen mal testen.

Vielen Dank.
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.167 Beiträge
 
Delphi 12 Athens
 
#6

AW: Bruch ermitteln

  Alt 1. Okt 2018, 09:01
Schönes Verfahren.
Aber sind da nicht noch ein paar Divisionen durch 0 nicht abgefangen ?
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:44 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz