"Frac" Funktion mit BigNum2?
spacer
Autor Nachricht
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
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.


Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 504
Erhaltene Danke: 30


Delphi 2-4
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?
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 15843
Erhaltene Danke: 742

XP, W7 x64 (Chrome, IE9, FF), Debian, (OSX 10.7)
RAD XE 2, Java (NB), C++, C# (VS 2010), JS/HTML, 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.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 504
Erhaltene Danke: 30


Delphi 2-4
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
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
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 markieren
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
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 15843
Erhaltene Danke: 742

XP, W7 x64 (Chrome, IE9, FF), Debian, (OSX 10.7)
RAD XE 2, Java (NB), C++, C# (VS 2010), JS/HTML, 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.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
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 markieren
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
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
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.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 504
Erhaltene Danke: 30


Delphi 2-4
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."
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
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?
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 504
Erhaltene Danke: 30


Delphi 2-4
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
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
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?
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 504
Erhaltene Danke: 30


Delphi 2-4
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.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
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".
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 504
Erhaltene Danke: 30


Delphi 2-4
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.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
home home