Autor |
Beitrag |
jsbach
      
Beiträge: 53
Win XP
D5 Ent
|
Verfasst: So 27.11.11 16:58
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
      
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: 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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
      
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: 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.
Zuletzt bearbeitet von Delphi-Laie am So 27.11.11 17:51, insgesamt 1-mal bearbeitet
|
|
jsbach 
      
Beiträge: 53
Win XP
D5 Ent
|
Verfasst: 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.
www.delphi-forum.de/....php?p=502513#502513
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 53
Win XP
D5 Ent
|
Verfasst: 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.
www.delphi-forum.de/....php?p=502513#502513
|
|
jsbach 
      
Beiträge: 53
Win XP
D5 Ent
|
Verfasst: 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
      
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: 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 
      
Beiträge: 53
Win XP
D5 Ent
|
Verfasst: 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
      
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: 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?
Zuletzt bearbeitet von Delphi-Laie am So 27.11.11 18:40, insgesamt 3-mal bearbeitet
|
|
jsbach 
      
Beiträge: 53
Win XP
D5 Ent
|
Verfasst: So 27.11.11 18:35
d.h. die Wurzelfunktion gibt mir immer nur den ganzazhligen Anteil wieder?
|
|
Delphi-Laie
      
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: 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 
      
Beiträge: 53
Win XP
D5 Ent
|
Verfasst: So 27.11.11 18:49
dann bedanke ich mich recht herzlich für die hilfe und schließe mit "frage beantwortet".
|
|
Delphi-Laie
      
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: 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.
|
|