Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: Sonstiges (https://www.delphipraxis.net/45-library-sonstiges/)
-   -   Delphi Annäherung eines Bruches (https://www.delphipraxis.net/35253-annaeherung-eines-bruches.html)

jfheins 4. Dez 2004 13:10


Annäherung eines Bruches
 
Liste der Anhänge anzeigen (Anzahl: 1)
Diese rekursive Prozedur nähert einen Bruch mit Hilfe eines Kettenbruches an.

Sie erwartet 3 Parameter:
:arrow: Den Zähler (var)
:arrow: Den Nenner (var)
:arrow: Die Tiefe

Je größer der letzte Parameter, desto genauer ist die Näherung, und desto größe werden die Zahlen.

Beispiel:
Zähler: 1461
Nenner: 651

Tiefe: 0
Ergebnis: 2/1

Tiefe: 1
Ergebnis: 9/4

Tiefe: 2
Ergebnis: 101/45

Tiefe: 3
Ergebnis: 193/86

Tiefe: 4
Ergebnis: 294/131

Tiefe: 5
Ergebnis: 487/217

Das letzte Ergebnis ist der vollständig gekürzte Bruch,
die Differenz zum Ausgangsbruch beträgt also 0.

Es wird nur mit positiven Zahlen gerechnet, ein eventuelles Vorzeichen wird entfernt !

Delphi-Quellcode:
procedure Kettenbruch (var z1, z2: Int64; Ebenen: Byte);
var
  Ganzzahl, Zaehler, Nenner: Int64;
begin
  z1 := abs(z1); // Vorzeichen werden entfernt
  z2 := abs(z2);

// aus dem (unechten) Bruch wird ein gemischter Bruch
  Ganzzahl := z1 DIV z2;
  Zaehler := z1 - (Ganzzahl * z2);
  Nenner := z2;

// Falls die angegebene Tiefe erreicht ist, oder der Ausgangsbruch vollständig angenähert wurde,
// wird der gemischte Bruch auf einen unechten X/1 Bruch gerundet.
  if (Ebenen = 0) OR (Zaehler = 0) then
  begin
    Zaehler := Ganzzahl + round (Zaehler / Nenner);
    Nenner := 1;
  end
  else // Rekusion mit dem Kehrwert des Bruches aus dem gem. Bruch; gem. Bruch > unechter Bruch
  begin
    Kettenbruch (Nenner, Zaehler, Ebenen - 1);
    Zaehler := Zaehler + (Ganzzahl * Nenner);
  end;

// var-parameter werden verändert
  z1 := Zaehler;
  z2 := Nenner;
end;
[edit=flomei]Auf Wunsch eine kleine Änderung vorgenommen. Mfg, flomei[/edit]
[edit=Chakotay1308]Klassifizierung. Mfg, Chakotay1308[/edit]
[edit=fkerber]Neu abgespeichert wg. Code-Highlighting. Mfg, fkerber[/edit]

jfheins 8. Dez 2004 15:36

Re: Annäherung eines Bruches
 
Zur Erklärung, was ein Kettenbruch ist

Wir nehmen obiges Beispiel (1461 / 651)

Code:
1461        159         1           1              1
----  = 2  ---  = 2  ---  = 2  ------  = 2  ---------
641         651        651            10             1
                       ---        4  ---        4  ------
                       159           159                9
                                                   15  --
                                                       10
|________________|________________________|__________________|_________
Tiefe 0            Tiefe 1                  Tiefe 2            Tiefe 3
bei der erreichten Tiefe wird einfach gerundet. (z.B. 9/10 auf 1 >>> 15 + 1)


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:18 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz