AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi neues Thema: Primfaktorzerlegung bricht mit exitcode 201 ab
Thema durchsuchen
Ansicht
Themen-Optionen

neues Thema: Primfaktorzerlegung bricht mit exitcode 201 ab

Ein Thema von pyromane · begonnen am 22. Apr 2008 · letzter Beitrag vom 24. Apr 2008
Thema geschlossen
Seite 1 von 2  1 2      
pyromane

Registriert seit: 5. Sep 2007
15 Beiträge
 
#1

neues Thema: Primfaktorzerlegung bricht mit exitcode 201 ab

  Alt 22. Apr 2008, 21:03
Hoi,
ich schreib grade eine "Algorithmen" Bibliothek, mit einer grafischen Benutzeroberfläche.
Ich hab schon die Berechnung des ggTs von 2 Zahlen über den Euklid'schen Algorithmus und die darauf basierende Berechnung des kgVs.
Jetzt schreib ich mehrere Verfahren zur Berechnung von Pi.
-> 1. Monte-Carlo-Verfahren.
Ich berechne dieses folgendermaßen:

Delphi-Quellcode:
function pi_montecarlo(n : int64):double; {Ermittlung von Pi mit der Monte Carlo Methode}
var
x,sy:double;
i: int64;
begin

sy:=0;
  for i:= 0 to n-1 do
    begin
      x:=Random;
      sy:=sy+sqrt(1-sqr(x));
    end;
  result:=(4*sy/n);

end;
und geb Pi mit
Delphi-Quellcode:

label5.caption:=floattostr(pi_montecarlo(n));
aus...
Warum bekomm ich dann immer Ungültige Gleitkommaoperation??
Unter Turbo Pascal funktioniert dieselbe Formel einwandfrei!

Delphi-Quellcode:
program MonteCarloRechteck;
uses crt;
var
  x: double; { Koordinaten }
  i,n: Longint;
  sy: double; { Summe der Fkt-Werte }          { Anzahl der Druchläufe }
begin
clrscr;
writeln('n : ');
readln(n);
  Randomize;
  sy := 0;
  for i := 0 to n-1 do begin
    x := Random;
    sy := sy + sqrt(1-sqr(x)) { y ausrechnen und addieren zu sy }
  end;
  WriteLn(4*sy/n); { ueber Flaecheninhalt in pi umrechnen }

Readln;
end.
mfg Pyromane


//Edit: es scheint, dass n immer 0 ist, da nach der Abfrage
Delphi-Quellcode:
if n=0 then result:=0
else result:=4*sy/n
immer 0 zur+ckgegeben wird. Das Erklärt auch die Ungültige Gleitkommaoperation (
Division durch 0)^^
Angehängte Dateien
Dateityp: zip algorithmen_915.zip (250,6 KB, 7x aufgerufen)
 
Benutzerbild von Fussball-Robby
Fussball-Robby

Registriert seit: 22. Okt 2007
Ort: Nähe Köln
1.063 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Ungültige Gleitkommaoperation bei einer Double berechnun

  Alt 22. Apr 2008, 21:09
Das dürfte so eigentlich garnicht funktionieren, da eine Schleifen-Variable von ordinalem Typ sein muss, und Int64 ist kein solcher.

In welcher zeile tritt der Fehler denn auf?

Mfg
Robert L.
Der folgende Satz ist richtig!
Der vorherige Satz ist falsch!

Paradox
 
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Ungültige Gleitkommaoperation bei einer Double berechnun

  Alt 22. Apr 2008, 21:12
Zitat von Fussball-Robby:
Das dürfte so eigentlich garnicht funktionieren, da eine Schleifen-Variable von ordinalem Typ sein muss, und Int64 ist kein solcher.

Mfg
Warum ist int64 denn kein Ordinaler Wert?
Int64 ist doch ganz klar auf- und auch abzählbar.

Grüße
Klaus
Klaus
 
pyromane

Registriert seit: 5. Sep 2007
15 Beiträge
 
#4

Re: Ungültige Gleitkommaoperation bei einer Double berechnun

  Alt 22. Apr 2008, 21:16
jop das mit dem int hab ich schon wieder auf Longint gestellt. Das hatte ich nur live verändert.
Es geht um die Div durch 0

LOOL ...
ich hab Das zuweisen der Var n vergessen sry

//Edit:das coole isr nur, dass das Ergebnis Variert, da Es auf Zufallszahlen basiert.
//Edit2: Weis einer, wie ich trotzdem größere Zahlwerte benutzen kann?
Ich mein.. die heutigen Rechner rechnen ja schon die Volle IntegerZahl viel zu schnell aus...
Int64 geht nicht, und Double kann ich ja net als Zählvariable benutzen. würde folgendes funktionieren:
Delphi-Quellcode:
var i, n:double
i:=0;

repeat
 i:=i+0,1;
 {Anweisung}
until i=n;
??? So könnte man ja durch verschieben des Kommas die Zählvariable immer vergrößern.
 
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Ungültige Gleitkommaoperation bei einer Double berechnun

  Alt 22. Apr 2008, 21:21
Zitat von Klaus01:
Warum ist int64 denn kein Ordinaler Wert?
Int64 ist doch ganz klar auf- und auch abzählbar.
Sollte man meinen.

Zitat:
[Pascal Fehler] Unit1.pas(34): E2032 FOR-Schleifenvariable muss von ordinalem Typ sein
Edit: Ah, wieder was gelernt: INT64 nicht ordinal?
 
pyromane

Registriert seit: 5. Sep 2007
15 Beiträge
 
#6

Re: Ungültige Gleitkommaoperation bei einer Double berechnun

  Alt 22. Apr 2008, 21:32
mkay
also das mit +0.1 scheint net zu gehen
er hat so 90% auslastung, es kommt aba niy bei raus...
 
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: Ungültige Gleitkommaoperation bei einer Double berechnun

  Alt 22. Apr 2008, 21:37
..reicht Dir LongWord als großer Zahlenraum.
Longword 0..4294967295 unsigned 32-bit

Delphi-Quellcode:
function pi_montecarlo(n : LongWord):double; {Ermittlung von Pi mit der Monte Carlo Methode}
var
x,sy:double;
i: LongWord;
begin

sy:=0;
  for i:= 0 to n-1 do
    begin
      x:=Random;
      sy:=sy+sqrt(1-sqr(x));
    end;
  result:=(4*sy/n);

end;
Grüße
Klaus
Klaus
 
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Ungültige Gleitkommaoperation bei einer Double berechnun

  Alt 22. Apr 2008, 21:40
Wenn die Auslastung 90% beträgt, dann rechnet dein Rechner sicher noch. Hast du lange genug gewartet?

Ich habe bei deinem ursprünglichen Algorithmus spaßeshalber mal 5000000 (5 Millionen) als n eingegeben und da rechnete mein Laptop einige Zeit. Ich möchte gar nicht wissen wie lange das bei einem Integer, der auch bis über 2 Milliarden reicht, dauert.
Für die Repeat-Schleife könntest du auch Int64 nutzen ohne Umweg über einen Double.
 
pyromane

Registriert seit: 5. Sep 2007
15 Beiträge
 
#9

Re: Ungültige Gleitkommaoperation bei einer Double berechnun

  Alt 23. Apr 2008, 05:17
ne ich meinte, dass diese ungewöhnliche hohe Auslastung zustanden kam, als ich von i:=0 n:=10 To n-2 in 0.1er Schritten vorangin... (10-1)/0.1=90.... 90Durchgänge können nicht so lange dauern.!
 
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Ungültige Gleitkommaoperation bei einer Double berechnun

  Alt 23. Apr 2008, 06:10
Ah, das meinst du.

Man sollte Gleitkommazahlen nie direkt vergleichen, da intern immer Ungenauigkeiten auftreten können. So könnte intern beispielsweise der Wert 0.1 den Wert 0.099999999999999 haben (nur zur Veranschaulichung, tatsächlich wird dieser vermutlich anders aussehen). Das Problem hat man übrigens nicht nur bei Delphi.
Es kann daher sein, dass du eine Endlosschleife programmiert hast. Versuche mal, die beiden Double-Werte mit dieser Funktion zu vergleichen:

Delphi-Quellcode:
// ...
until VglDouble(i, n);
Grüße, Matze
 
Thema geschlossen
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:42 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz