Entwickler-Ecke

Sonstiges (Delphi) - Mathematische Zeichen in Delphi?


Swordooo - Mi 02.07.08 18:40
Titel: Mathematische Zeichen in Delphi?
Hi,
Ich möchte schon seit Längerem ein Programm basteln, dass mir eine Wurzel zieht (undzwar sehr viele Kommastellen!).

Hier ist eine Beispielaufgabe aus der Schule:

Finde die Wurzel aus 52! (√52)
√52 = √13*4

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
1.) Schritt:13+4  = 8,5
                 2

2.) Schritt: 52   = 6,1
8,5

3.) Schritt: 8,5+6,1   = 7,3
                  2

4.) Schritt: 52      = 7,123
                7,3

5.) "        7,3+7,123  = 7,2115
                    2

usw... Das ist die Methode, wie man Wurzeln mit der Hand zieht. Hätte da jem. eine Idee, wie man das in Delphi verwirklichen kann?

MfG Swordooo

Moderiert von user profile iconNarses: Code-Tags hinzugefügt und Punkte entfernt


FinnO - Mi 02.07.08 18:48

tjaa.. Canvas würde ich sagen


Hidden - Mi 02.07.08 18:57

Hi,

Willst du:
Versuch mal die code- bzw. delphi-Tags. die dürften deine Formatierung erhalten.

mfG,


Swordooo - Mi 02.07.08 19:00

ist canvas nicht für Grafische Darstellungen da?

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

ohh danke.
Sqrt() ist genau das was ich suche und dann mach ich das mit Extended.

Gibt es eine grenze bei Extended (Kommsstellen, generelle Länge)?

Ich glaube Extended geht von: 3,4 x 10^-4932 bis 1,1 x 10^4932, aber ich dachte immer Extended hat nur 20 Nachkommastellen und ist 10 Byte groß?


Hidden - Mi 02.07.08 19:08

Hi,

user profile iconSwordooo hat folgendes geschrieben:
ist canvas nicht für Grafische Darstellungen da?
Ja, er hat nur den Titel gelesen. Deshalb auch meine mehr oder weniger dumme Frage zu deinem Post weiter oben. Bin aber gerade dabei, nen Algorithmus zu zu schreiben und mache gleich nen Edit.



Edit1: Schau mal hier [http://www.epinasoft.com/delphikurs/dkk_datatypes.html].

Edit2: So. größere Genauigkeit als Sqrt() bekommst du aber nur, wenn du die Zahlen anders speicherst.. da bräuchtest du imho einen Datentypen wie bigint oder so, der nicht im Standard-Delphi enthalten ist.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
function GetAccurateSqrt(X: Extended): Extended;
var
  Speicher1, Speicher2: Extended;
  tmpTimer: TTimer;
begin
  //initialisieren der zwischenspeicher mit zwei Faktoren der Zahl
    Speicher1 := X / 2;
    Speicher2 := 2;  //kannst schlecht ne Gleitkommazahl auf Teiler prüfen, insofern.. Auf Integer willst du wahrscheinlich auch nicht begrenzen^^.
  //lost gehts ;)
  tmpTimer := TTimer.Create(nil);
  tmpTimer.Interval := 100;  //nach 100 Millisekunden Abbruch. Wahrscheinlch würde man eher eine fixe Schleife verwenden: for i := 0 to 12324323
  tmpTimer.Tag := 0;
  tmpTimer.Enabled := true;
  repeat
    Speicher1 := (Speicher1 + Speicher2) / 2;
    Speicher2 := X / Speicher1;
  until tmpTimer.Tag = 1;
  tmpTimer.Free;
  result := Speicher2;
end;

procedure GetAccSqrt_TimeOut(Sender: TObject);  //nicht die feine, englische Art - aber soll ja keine langsamen Computer mit fixer Schleifendurchlaufzahl ausbremsen^^
begin
  (Sender as TTimer).Tag := 1;
end;


So, zu den Problemen: Wie o.ä., bräuchtest du wahrscheinlcih einen besonderen Datentypen, damit es sich lohnt - imho unrealistischer Aufwand ;) .

Ich habe gerade überlegt, was man am besten als Startwerte für V1, V2 nimmt und bin zu dem Schluss gekommen: Am besten Sqrt(X), Sqrt(X) :lol:

Das sind die beiden größtmöglichen Teiler, damit erhältst du am Ende die größte Genauigkeit^^

mfG,


Swordooo - Mi 02.07.08 19:36

Jo Danke für deine Mühe!


FinnO - Mi 02.07.08 21:22

zu meiner Verteidigung:

ICh dachte, er möchte die Bruchstriche, die er in seinem Post so mühsam mit

234*24*24

....2

dargestellt hat in Delphi anzeigen. sonst hätte ich auch sqrt gesagt ^^


Martok - Mi 02.07.08 21:39

user profile iconHidden hat folgendes geschrieben:
Ich habe gerade überlegt, was man am besten als Startwerte für V1, V2 nimmt und bin zu dem Schluss gekommen: Am besten Sqrt(X), Sqrt(X) :lol:

Das sind die beiden größtmöglichen Teiler, damit erhältst du am Ende die größte Genauigkeit^^

Super, um die Wurzel zu berechnen benutze ich die Wurzel :roll:


FinnO - Mi 02.07.08 21:59

hat doch was ^^


Hidden - Mi 02.07.08 22:14

user profile iconHidden hat folgendes geschrieben:
Ich habe gerade überlegt, was man am besten als Startwerte für V1, V2 nimmt und bin zu dem Schluss gekommen: Am besten Sqrt(X), Sqrt(X) :lol:

user profile iconMartok hat folgendes geschrieben:
Super, um die Wurzel zu berechnen benutze ich die Wurzel :roll:

Deshalb ja das :lol: -Simley. Mit anderen Worten: Bei dieser Art von Berechnung erhalte ich stets eine kleinere Genauigkeit als mit Sqrt(), da diese Methode die größte Genauigkeit bei Startwert Sqrt(), Sqrt() hat.

mfG,