Autor Beitrag
jsbach
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53

Win XP
D5 Ent
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: So 27.11.11 17:10 
user profile iconjsbach hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: So 27.11.11 17:47 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53

Win XP
D5 Ent
BeitragVerfasst: 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?

ausblenden 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); //Initialization

    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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 27.11.11 17:50 
user profile iconDelphi-Laie hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53

Win XP
D5 Ent
BeitragVerfasst: 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?

ausblenden 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); //Initialization

    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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53

Win XP
D5 Ent
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53

Win XP
D5 Ent
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: So 27.11.11 18:33 
In welche Schulklasse gehst Du bzw. bis zu welcher Klasse besuchtest Du eine Schule?

user profile iconjsbach hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53

Win XP
D5 Ent
BeitragVerfasst: So 27.11.11 18:35 
d.h. die Wurzelfunktion gibt mir immer nur den ganzazhligen Anteil wieder?
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: So 27.11.11 18:43 
user profile iconjsbach hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53

Win XP
D5 Ent
BeitragVerfasst: So 27.11.11 18:49 
dann bedanke ich mich recht herzlich für die hilfe und schließe mit "frage beantwortet".
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: So 27.11.11 18:59 
user profile iconjsbach hat folgendes geschrieben Zum zitierten Posting springen:
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.