Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - "Frac" Funktion mit BigNum2?
jsbach - So 27.11.11 16:58
Titel: "Frac" Funktion mit BigNum2?
Hallo,
ich möchte mit BigNum2 Quadratzahlen finden. Mit reellen Variablen habe ich immer "frac" verwendet, aber das gibt es ja nicht in BigNum2. (oder doch?)
a:=sqrt(b);
if frac(a)=0 then "b ist Quadratzahl"
Gibt es eine Möglichkeit das umzuschreiben?
Danke und viele Grüße
jsbach
Delphi-Laie - So 27.11.11 17:10
jsbach hat folgendes geschrieben : |
Hallo,
ich möchte mit BigNum2 Quadratzahlen finden. Mit reellen Variablen habe ich immer "frac" verwendet, aber das gibt es ja nicht in BigNum2. (oder doch?)
a:=sqrt(b);
if frac(a)=0 then "b ist Quadratzahl"
Gibt es eine Möglichkeit das umzuschreiben? |
Gibt es dort die Funktion int()? Dann würde b<>int(b) (oder b>int(b)) zum gewünschten Ergebnis führen.
Doch frac() ist eine Funktion für reelle Zahlen, genauso wie int(). Falls der verwendete Datentyp in BigNum2 ein integrer ist, dann ist int() sinnlos und muß, falls überhaupt existiert, dasselbe wie das Ergebnis selbst sein.
Schau mal in den Quelltext: Gibt es für die Quadratwurzelfunktion noch ein weiteres Ergebnis bzw. einen weiteren Rückgabewert (Flag, Boolean o.ä.), das anzeigt, ob die Quadratwurzel "aufging", also ganzzahlig ist?
jaenicke - So 27.11.11 17:40
Wie wäre es, wenn du b mit sich selbst mutiplizierst und die beiden Zahlen vergleichst... Das geht ohnehin sehr viel schneller als die Wurzel zu ziehen usw. und ist auch viel einfacher...
Zudem hast du dann nicht das Problem von Darstellungsungenauigkeiten im Binärsystem, durch die dein Vergleich des Nachkommaanteils mit 0 auch nicht immer klappen muss.
Delphi-Laie - So 27.11.11 17:47
jaenicke hat folgendes geschrieben : |
Wie wäre es, wenn du b mit sich selbst mutiplizierst und die beiden Zahlen vergleichst... Das geht ohnehin sehr viel schneller als die Wurzel zu ziehen usw. und ist auch viel einfacher. |
Das Wurzelziehen bleibt jsbach doch gar nicht erspart, sondern ist das eigentliche Ziel, ihm/ihr ging es doch nur um die Kontrolle, ob es sich um ein ganzzahliges Ergebnis handelt.
jsbach - So 27.11.11 17:48
Also ich hab relativ wenig Ahnung von dem Ganzen und habe bisher nur die Grundrechenarten genutzt. Vielleicht nützt dir das hier schon was?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| Function BM_SquareRoot(Num: TBigNumber): TBigNumber; Var Prev: TBigNumber; Two: TBigNumber; Begin SetLength(Two, 1); Two[0] := 2;
BM_Assign(Result, Num); BM_Assign(Prev, BM_Add(Num, Num)); While Not BM_CompareNC(Result, Prev) Do Begin BM_Assign(Prev, Result); BM_Assign(Result, BM_Divide(BM_Add(Result, BM_Divide(Num, Result)), Two)); End;
BM_Assign(Result, Prev); End; |
Hier mal der Link zur bigNum2 Bibliothek.
http://www.delphi-forum.de/viewtopic.php?p=502513#502513
jaenicke - So 27.11.11 17:50
Delphi-Laie hat folgendes geschrieben : |
Das Wurzelziehen bleibt jsbach doch gar nicht erspart, sondern ist das eigentliche Ziel, ihm/ihr ging es doch nur um die Kontrolle, ob es ein ganzzahliges Ergebnis handelt. |
// EDIT:
Ok, aber dennoch geht der Vergleich so einfacher.
jsbach - So 27.11.11 17:56
Also ich hab relativ wenig Ahnung von dem Ganzen und habe bisher nur die Grundrechenarten genutzt. Vielleicht nützt dir das hier schon was?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| Function BM_SquareRoot(Num: TBigNumber): TBigNumber; Var Prev: TBigNumber; Two: TBigNumber; Begin SetLength(Two, 1); Two[0] := 2;
BM_Assign(Result, Num); BM_Assign(Prev, BM_Add(Num, Num)); While Not BM_CompareNC(Result, Prev) Do Begin BM_Assign(Prev, Result); BM_Assign(Result, BM_Divide(BM_Add(Result, BM_Divide(Num, Result)), Two)); End;
BM_Assign(Result, Prev); End; |
Hier mal der Link zur bigNum2 Bibliothek.
http://www.delphi-forum.de/viewtopic.php?p=502513#502513
jsbach - So 27.11.11 18:06
Also gibt es leider keine Möglichkeit zum "Testen" ob es sich um ein Quadrat handelt. Hab ich das richtig verstanden?
Ich könnte natürlich zuvor in einem Array oder Liste alle Quadratzahlen bis ... speichern und zum Vergleich abrufen.
Wäre jetzt meine letzte Idee.
Delphi-Laie - So 27.11.11 18:14
jaenickes Idee war und ist gut und vielleicht die einzig zielführende: Weiter unten in der Diskussion über die großen Zahlen schreibt BenBE: "Jup. Das ist der ganzzahlige Anteil, der ABGERUNDETEN eigentlichen Wurzel. D.h. Wurzel von 2 gibt er 1 zurück, bei Wurzel 3 gibt er auch 1 und bei Wurzel 4 gibt er 2 zurück. Ist über Tangenten-Verfahren\Regula Falsi implementiert."
jsbach - So 27.11.11 18:26
Jetzt steh ich ehrlich gesagt etwas auf dem Schlauch. Wenn ich eine Zahl b=17 habe und wissen möchte, ob es eine Quadratzahl ist. Ich kann jetzt a:=srqt(b) benutzen und erhalte entweder eine Zahl a mit oder ohne Nachkommastellen. Was soll ich denn da Quadrieren und vergleichen?
Delphi-Laie - So 27.11.11 18:33
In welche Schulklasse gehst Du bzw. bis zu welcher Klasse besuchtest Du eine Schule?
jsbach hat folgendes geschrieben : |
Jetzt steh ich ehrlich gesagt etwas auf dem Schlauch. Wenn ich eine Zahl b=17 habe und wissen möchte, ob es eine Quadratzahl ist. Ich kann jetzt a:=srqt(b) benutzen und erhalte entweder eine Zahl a mit oder ohne Nachkommastellen. Was soll ich denn da Quadrieren und vergleichen? |
Das quadrierte Ergebnis des Radizierens mit dem Argument: sqrt(17)"="4, 4*4=16, 16<>17->4 ist keine genaue (eben nur die ganzzahlige) Wurzel von 17.
Fällt nun der Groschen?
jsbach - So 27.11.11 18:35
d.h. die Wurzelfunktion gibt mir immer nur den ganzazhligen Anteil wieder?
Delphi-Laie - So 27.11.11 18:43
jsbach hat folgendes geschrieben : |
d.h. die Wurzelfunktion gibt mir immer nur den ganzazhligen Anteil wieder? |
Lies Dir doch selbst die Diskussion, aus der Du die bigint-unit erwarbst, durch, oder frage BenBE selbst. Beides wird wohl kaum jemand für Dich tun. Auch mit Selberprobieren kommt man gewöhnlicherweise weiter.
jsbach - So 27.11.11 18:49
dann bedanke ich mich recht herzlich für die hilfe und schließe mit "frage beantwortet".
Delphi-Laie - So 27.11.11 18:59
jsbach hat folgendes geschrieben : |
dann bedanke ich mich recht herzlich für die hilfe und schließe mit "frage beantwortet". |
Mir ist durchaus klar, daß ich zum Schluß etwas schroff wirktes. Zwischenzeitlich machtest Du den Eindruck, die dahinterstehende (eklementare) Mathematik nicht zu beherrschen. Das ist natürlich eine ganz schlechte Voraussetzung, mit ihr zu programmieren. Ich hoffe, daß sie jetzt ein Quentchen klarer ist und auch, wie diese Hilfe zur Selbsthilfe (welch eine abgedroschene Floskel eigentlich) gemeint war.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!