AGB  ·  Datenschutz  ·  Impressum  







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

Wie Funktioniert Decimal.Divide?

Ein Thema von Dax · begonnen am 10. Mai 2005 · letzter Beitrag vom 11. Mai 2005
Antwort Antwort
Seite 1 von 2  1 2      
Dax
(Gast)

n/a Beiträge
 
#1

Wie Funktioniert Decimal.Divide?

  Alt 10. Mai 2005, 14:32
Hi Leute

Die Frage steht schon oben im Titel: Wie funktioniert die Decimal.Divide-Methode? Soweit ich informiert bin besteht der Decimal-Typ zum größten Teil aus einem int[3]-Array.. Ich will mir einen eigenen Typ in der Art bauen, weils das DEC-Math ja auf .NET nicht gibt, und was mir noch fehlt, wär eben der Divisionsalgorithmus...

Weiß jemand Rat?

Danke
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#2

Re: Wie Funktioniert Decimal.Divide?

  Alt 10. Mai 2005, 14:34
Das habe ich mich auch schon gefragt .
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#3

Re: Wie Funktioniert Decimal.Divide?

  Alt 10. Mai 2005, 15:33
Dax, willst du jetzt wissen, wie diese Divide-Funktion intern arbeitet, oder wie man sie anwendet?
Und, Khabarakh, war das auch wirklich deine Frage?

  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#4

Re: Wie Funktioniert Decimal.Divide?

  Alt 10. Mai 2005, 15:34
Mathias Also wirklich. Ich will wissen, wie das Ding arbeitet, weil sich die MS-Assemblies leider asl ILDAsm-resitent erweisen. Warum eigentlich? Das will ich bei meinen auch mache können
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#5

Re: Wie Funktioniert Decimal.Divide?

  Alt 10. Mai 2005, 15:37
Code:
public static decimal Divide(decimal d1, decimal d2)
{
      decimal num1 = new decimal(0);
      decimal.FCallDivide(ref num1, d1, d2);
      return num1;
}
Ab da kann ich es im Moment nicht mehr weiter verfolgen, weil:
Code:
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void FCallDivide(ref decimal result, decimal d1, decimal d2);
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#6

Re: Wie Funktioniert Decimal.Divide?

  Alt 10. Mai 2005, 15:38
*grummel* Irgendeinen Algorithmus muss dieses FCallDevide ja anwenden, aber irgendwie.. hab schon in der DP gesucht, bei Wikipedia, Informatiklehrer gefragt.. wusste wohl niemand.

Hagen?
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#7

Re: Wie Funktioniert Decimal.Divide?

  Alt 10. Mai 2005, 15:40
Mich würde interessieren, woher die "FCallDivide"-Funktion eigentlich kommt.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#8

Re: Wie Funktioniert Decimal.Divide?

  Alt 10. Mai 2005, 15:54
Ähm ja, das war ein etwas zu kurzer Post .
Also, ich habe mich schon oft gefragt, wie solche mathematischen Funktionen von selbst erstellten Typen funktionieren und aussehen. Von der NInts-Unit ist ja nur die .dcu enthalten, aber ob mir der Quellcode so viel sagen würde .
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#9

Re: Wie Funktioniert Decimal.Divide?

  Alt 10. Mai 2005, 20:00
Es gibt ganz verschiedene Divisions Algorithmen:

- binär durch einfache Shift Operationen
- Multiplikation mit dem Reziprokal sprich X = Y * 1/R, wobei man das Reziproke 1/R durch eine Newton Iteration berechnet, lohnt nur bei wiederholter Division mit dem gleichem Reziproken
- basierend auf der Fast Fourier Transformation
- die Schoolboy Methode
- die Division mit Hilfe der Newton Iteration
- die modulare Division nach Montgomery
- die normale Methode nach Donald E. Knuth, dabei wird TopDown eine Aproximation benutzt und der Fehler durch Multiplikationen ausgeglichen
- die schnelle rekursive Karatsuba Division nach Christoph Burnikel & Joachim Ziegler vom Max Planck Institut, sie basiert auf der Idee die bei der Karatsuba Multiplikation angewendet wird -> Teile und Herrsche, Divide and Conquer


Essentiell benötigt man bei sehr großen Zahlen als erstes eine schnelle Multiplikation, danach kann man auch schnelle Divisionen implementieren. Die Division kann minimal 2 mal so lange dauern wie eine Multiplikation, schneller geht nicht.

Für eine schnelle Multiplikation gibt es:
- Schoolboy Methode, so wie du auf dem Papier rechnest nur mit dem Unterschied das man nicht dezimal rechnet sondern zb. zu Basis 2^32.
- COMBA Methode
- TOOM COOK Methode
- Karatsuba Methode
- Fast Fourier Methode -> Nußbaumer FFT, Zahlentheoretische FFT und Modulare Fermat FFT nach Schönhage und Strassen

ohne Assembler wirst du es aber nie schnell hinbekommen.

Alle oben angesprochenen Miltiplikations Methoden sind im DEC implementiert. Nur bei den FFT's habe ich nur die modulare Fermat FFT nach Schönhage& Strassen genommen. Diese ist asympthotisch die schnellst Art und Weise zwei Zahlen zu multiplizieren, allerdings ist sie auch ziemlich kompliziert.

Bei der Division enthält das DEC die Methoden nach D.E. Knuth für kleine Zahlen und die rekursive Karatsuba Division nach Burnickel & Ziegler. Desweiteren noch den Montomergy Trick um schnelle modulare Division durchzuführen. Die Kombination aus diesen drei Verfahren ist die nach meiner Kenntnis schnellste heutzutage machbare Implemntierung auf normalen 32Bit CISCs/ASICs/RISCs.

Die Multiplikation benutzt im DEC die Schoolboy, COMAB, TOOM-COOK-3, Karatsuba und Schönhage FFT. Also im Grunde fünf verschiedene Verfahren sind implementiert. Teile der Division, zb. die anch Burnickel&Ziegler benötigen eine schnelle Multiplikation.

Man wählt je nach Größe der zu multiplizierenden/dividierenden Zahlen dynamisch den entsprechenden Algorithmus aus.

Insgesamt habe ich über einen Zeitraum von drei Jahren alle nötigen mathematischen und technischen Dokumente zusammengesucht und immer mehr meine Implementierungen ausgebaut und verbessert. Es ist also keine triviale Sache und man muß schon ziemlich viel Zeit investieren. Zudem muß ich noch dazu sagen das ca. 80% des kompletten Sources für Multiplikationen und Divisionen in purem handmade Assembler gecodet ist. Dabei wurde auch im speziellen der MMX/SSE2 Befehlssatz neuerer Intel-CPU's benutzt. Du benötigst also ziemlich viel Wissen drumherum.

Hoffe das dir dieser Abriß einen kurzen Überblick verschafft hat.

Gruß Hagen
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#10

Re: Wie Funktioniert Decimal.Divide?

  Alt 10. Mai 2005, 20:59
Hmm.. hört sich alles ziemlich kompliziert an

Aber das eiigentlich ist ja: Ich würde gern mal wissen, wie man mit einem sturen array of Integer als X und Y eine Division X/Y durchführen kann. Muss ja nicht schnell sein, ich würds gern mal wissen und verstehen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 07:48 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