![]() |
Wurzeln Wie schreibt man die
Hi Delphianer
Ich hoffe das passt hier rein hab keine passendere Sparte gefunden Und gesucht hab ich auch schon Ich hab als hausaufgabe ein Programm auf das die pythagorätischen zahlen raussucht Den Algorhitmus hab ich schon fast fertig allerdings brauch ich dafür Wurzeln Nun Meine frage: Wie kann ich delphi klarmachen das es aus ner Zahl die Wurzel ziehen will??? es gibt bestimmt ne Taste die find ich aber nicht Bitte um schnelle hilfe Axxus |
Re: Wurzeln Wie schreibt man die
Die Funktion dazu in Delphi heisst SQRT, alles weiter dazu in der OH.
|
Re: Wurzeln Wie schreibt man die
Ok das funzt schon ma
Aber wer pythagoräische zahlen in der Schule gehabt hat weiß, das es nur gillt wenn alles ganze zahlen sind Beispiel: 3² + 4² = 5² oder algemein x² + y² = z² So bei meinem prog geht der ne bestimmte anzahl an zahlen durch und setzt diese für a und b ein die formel is bis jetzt so
Delphi-Quellcode:
so ich hat eigentlich gedacht das ich es mit ner try except Schleife mache also das ich die Wurzel aus z1 (also z2) als integer deklariere und wenn es ne Komma oder irrationale zahl wird dann soll er nichts machen und wenn es ne ganzzahl wird dann soll er sie in ne liste eintragen
z1 : integer
z2 : double; z1 := x*x + y*y; z2 := sqrt (z1); Ich kann aber z2 nicht als integer eklarieren weil sonst ein Fehler auftrit. Deswegen Wie kann ich feststellen ob eine zahl ne GAnzzahl ist??? bitte antwortet schnell ich will es bis morgen fertig haben Danke im vorraus Axxus |
Re: Wurzeln Wie schreibt man die
Zitat:
Denn... Zitat:
|
Re: Wurzeln Wie schreibt man die
Delphi-Quellcode:
if frac(z2)=0 then ...
Delphi-Quellcode:
...gibt noch mehr!
if round(z2)=z2 then ...
//Edit: Ich sende es trotzdem mal ab... Flare |
Re: Wurzeln Wie schreibt man die
Ich will auch gar nicht das ihr meine Hausaufgaben macht sonst macht es ja keinen Spass mehr wenn einer den Quelltext vorkaut :mrgreen: :mrgreen: :mrgreen:
Aber ich kenn nun mal den Syntax nicht :wall: :wall: :wall: Axxus |
Re: Wurzeln Wie schreibt man die
Dein Lehrer wird dir keine solche Hausaufgabe geben, wenn du das nötige Wissen dafür noch nicht hast.
|
Re: Wurzeln Wie schreibt man die
Zitat:
|
Re: Wurzeln Wie schreibt man die
Naja aber wenn man noch so in den Anfängen steckt, also die Grundlagen noch fehlen...
|
Re: Wurzeln Wie schreibt man die
Zitat:
|
DP-Maintenance
Dieses Thema wurde von "r_kerber" von "VCL / WinForms / Controls" nach "Object-Pascal / Delphi-Language" verschoben.
Da paßt es wohl eher hin, hat ja nichts mit VCL zu tun. |
Re: Wurzeln Wie schreibt man die
arg sry lesen sollte man können...
|
Re: Wurzeln Wie schreibt man die
Das war auf freiwilliger basis da ich erst in der 9. bin und der einzige in meiner Klasse bin der sich en bisi damit auskennt
Ich hab mir mein ganzes wissen selbst angeeignet wir ham jetzt in der 9. also seit diesem jahr info und sind grad bei office^^ Ok danke leute ich runde das Programm ab und stell es dann hier zum runterladen hin um mir erst ma Kritik einzufahren dann poste ich es vll bei Freeware So noch ein letztes Problem: Das Programm funzt!!!!! *freu* Aber ab ca 35000 zeigt der die Fehlermeldung ungültige Gleitkommaoperatoren an was is ein Gleitkommaoperator und woran liegt das??? Axxus |
Re: Wurzeln Wie schreibt man die
Bist du dir sicher, dass es Operator heißt und nicht Operation? Und wo genau tritt der Fehler auf?
|
Re: Wurzeln Wie schreibt man die
Ach verflucht
Tut mir ganz doll leit es heißt Operation :oops: :oops: :oops: Ich hät besser gucken sollen Wo der Fehler auftritt weiß ich nicht mitten im Programm zeigt er an Ungültige Gleitkommaoperation Keine Ahnung was das bedeutet In der Borland Hilfe steht zwar was bei E/A Fehler aber wenn ich auf ungültige Gleitkommaoperation gehe dann kann der die seite net laden |
Re: Wurzeln Wie schreibt man die
mmh das keiner weiß poste ich ma den Hauptquelltext
Delphi-Quellcode:
Seht ma durch und schaut was das problem ist
If Fehler <> true Then
begin For x := min_x to max_x do begin For y := min_y to max_y do begin If x < y Then begin z1 := x*x + y*y; z := sqrt (z1); if round(z)=z then begin Ausgabe := ( inttostr (x) + '; ' +inttostr (y) + '; ' + FloattoStr (z)); Memo.Lines.Add (Ausgabe); Liste.Add(Ausgabe); Counter := Counter + 1; end; end; end; end; Memo.Lines.Add(inttostr (counter) + ' Zahlentrippel'); counter := 0; end; Axxus |
Re: Wurzeln Wie schreibt man die
Setz mal ein paar Breakpoints und sag uns, in welcher zeile genau der fehler auftritt.
|
Re: Wurzeln Wie schreibt man die
Hab ich jetzt die Zeile ist:
Delphi-Quellcode:
Kann es vll daran liegen das z (extendet) nicht so viele nachkommastellen berechenen kann
z := sqrt (z1);
denn ich hab x = 30000 und y = 40000 Wenn ja wie kann ich runden hab zwar schon ma FormatFloat gefunden weiß aber net wies funzt Axxus |
Re: Wurzeln Wie schreibt man die
LOOOOL
Ein Extended kann Nachkommastellen ausrechnen, da fliegen dir die Löffel weg. Wenn du mich fragst, ist z1 negativ. |
Re: Wurzeln Wie schreibt man die
z1 kann nicht negativ werden
Delphi-Quellcode:
sollte x oder y negativ sein wird es duch das multipliziern wieder positiv
z1 := x*x + y*y;
z := sqrt (z1); außerdem nimmt x und yden wert von 1 bis 30000 an (bis dahin gehts) also wenn x links ist und y rechts 1 1 1 2 1 3 . . . 1 30000 2 1 2 2 . . . 2 30000 3 1 . . . deswegen muss es woanders dran liegen deswegen hab ich kein plan woran das liegen könnte x und y sind üprigesn integerwerte und z2 auch Axxus |
Re: Wurzeln Wie schreibt man die
Hä es ist mir unbegreiflich aber du hast recht z1 ist wirklich negativ :?: :?: :?: :?: :?: :?: :?: :?:
Aber wieso wirde der wert negativ weenn x und y positiv sind das ergibt keinen sinn Hat einer dafür ne erklärung |
Re: Wurzeln Wie schreibt man die
na wenn du's positiv haben willst dann mach es mal mit der funktion (abs(x):
Delphi-Quellcode:
oder vielleicht geht es auch so, kann ja an delphi liegen:
z := sqrt(abs(z1));
Delphi-Quellcode:
musste mal probieren.
z := sqrt(x*x + y*y);
|
Re: Wurzeln Wie schreibt man die
Setz mal nen Breakpoint auf die sqrt-Zuweisung und drück Strg+F7 und lass dir die Werte von x, y und z1 ausgeben.
|
Re: Wurzeln Wie schreibt man die
oder geh auf "überwachte ausdrücke" (Menüpunkt ansicht o.ä.)
und füge x, y, z1 hinzu und mach's dann mit f7 immer weiter |
Re: Wurzeln Wie schreibt man die
Hallo zusammen,
36001600000000 = 30000*30000+40000*40000 = z1 ist deutlich außerhalb von -2147483648..2147483647 und das ist alles, was ein Integer verkraften kann. Wenn man die entsprechende Exception deaktiviert hat, überprüft Delphi nicht, ob sich alle Zahlen in einem Integer in diesem Bereich befinden. Gelangt man außerhalb dieses Bereiches, stehen im betroffenen Integer irgendwelche lustigen Zahlen. Meistens negative. :wink: Gruß Malte |
Re: Wurzeln Wie schreibt man die
Da hast du Recht.
Einfach die Deklaration von z1 in Extended ändern und du kannst da Zahlen reinspeichern wie bekloppt. Achja: Bei einer Multiplikation dürften sich positiv-negativ so ziemlich die Waage halten. |
Re: Wurzeln Wie schreibt man die
is das auch bei Extended so denn wenn ich z1 als solchen deklariere dann passiert es immer noch z1 is dann -179343562632 oder so^^
jedenfalls tritt der fehler bei Extended auch noch auf wenn das auch zu klein ist habt ihr dann nen typ der richtig große Zahlen verkraften kann ich will mit dem programm eig dem Benutzer ne unendlich große anzahl an pythagoräischen zahlen liefern können und wenn schon 1.000.000*1.000.000 + 1.000.000*1.000.000 = 2*10^12 ist was is es dann erst bei 1.000.000.000 ^^ ich frag mich wie lange der rechenr dafür bracueh wird^^ jedenfalls gibt es einen typ der groß genug ist :?: :?: :?: |
Re: Wurzeln Wie schreibt man die
Laut OH kann Extended -3,6 x 10^4951 .. 1,1 x 10^4932 fassen bei einer Genauigkeit von 10 bis 20 Stellen. Das müsste also eigentlich langen...
Gruß Malte |
Re: Wurzeln Wie schreibt man die
Versuch erstmal, Int64 zu verwenden, der kann schonmal signifikant größere Zahlen verarbeiten, und noch größere Ganzzahlen werden sehr kompliziert ...
|
Re: Wurzeln Wie schreibt man die
Delphi-Quellcode:
Wenn x und y als Integer-Variablen vereinbart werden, wird die rechte Seite immer einen Integer-Wert liefern - unabhängig vom Typ der Variablen z1.
z1 := x * x + y * y;
Gruß Hawkeye |
Re: Wurzeln Wie schreibt man die
Um beliebig große (Integer-)Zahlen speichern u können brauchst du einen sogennaten VLI (Very Long Integer)
![]() ![]() |
Re: Wurzeln Wie schreibt man die
Hmm, seltsam...
|
Re: Wurzeln Wie schreibt man die
Zitat:
|
Re: Wurzeln Wie schreibt man die
Hawkeye. ;)
Hab aber rausgefunden, dass es tatsächlich so ist, wobei ich gedacht hätte, dass der Compiler intelligent genug ist, um das zu merken. Schließlich führt er einen impliziten Cast aus und kann dann auch gleich mit Extended rechnen. |
Re: Wurzeln Wie schreibt man die
Hallo 9. Klasse (undeutlich erinner ;))
ungültige Gleitkommaoperation. Deine Zahlen sind zu gross vom Wertebereich her. Oder zu ziehst eine Wurzel aus einer negativen Zahl. Byte kann z.B. nur 256 Zahlen. Was hast du denn für einen Variablentyp ? Double ? Tipp mal in der Hilfe Extended ein, dann siehst, wie gross die jeweiligen Zahlen werdne dürfen. In deinem Fall würde ich direkt Extended statt Double probieren. Heiko |
Re: Wurzeln Wie schreibt man die
Zitat:
|
Re: Wurzeln Wie schreibt man die
Delphi-Quellcode:
Das ließe sich optimieren:
z1 := x*x + y*y;
z := sqrt (z1);
Delphi-Quellcode:
Unit Math einbinden nicht vergessen.
z := Hypot(x, y);
|
Re: Wurzeln Wie schreibt man die
Ich glaube du kommst da mit einem anderen Ansatz besser:
Die Tripel kann man nämlich auch ausrechnen! Du suchst dir einfach beliebige Zahlen a und b, wobei b immer kleiner sein sollte als a. Dann kannst du dir die 3 Zahlen ausrechnen: x := a*a - b*b; y := 2 * a*b; z := a*a + b*b; für a=2 und b=1 kriegst du z.B. x=3, y=4 und z=5 Also nimm zwei Schleifen ineinander (so wie du's jetzt auch hast) für a und b und dann rechnest du die tripel alle nacheinander aus. Da brauchst du keine Wurzeln und es dürfte wesentlich schneller gehen. gruß raYman |
Re: Wurzeln Wie schreibt man die
ich kann x und y aber nur als integer vereinbarren da ich eine for do Schleife hab und die Variable muss von ordinarem wert sein (ich weiß zwar net (mehr) was ordinar ist aber ich glaub das es ne ganzzahl sien muss oder?) jedenfalls geht das net
mmh was mach ich |
Re: Wurzeln Wie schreibt man die
Ordinal heißt das, und das bedeutet, es muss ein ordinaler Typ sein. Ordinaltypen sind zum Beispiel Ganzzahlen außer Int64 und Aufzählungstypen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz