AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Problem mit überlauf bzw. division durch null
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit überlauf bzw. division durch null

Ein Thema von 13Joe37 · begonnen am 20. Okt 2008 · letzter Beitrag vom 21. Okt 2008
Antwort Antwort
Seite 1 von 2  1 2      
13Joe37

Registriert seit: 15. Okt 2008
9 Beiträge
 
#1

Problem mit überlauf bzw. division durch null

  Alt 20. Okt 2008, 14:55
Ahoihoi!!

ich sitz hier grad an nem kleinen Prog, das mir Pi "ausrechnet", nach folgender Methode: 1/1 + 1/4 + 1/9 + 1/16 + 1/25 + 1/36 .... 1/ n*n = Pi*Pi / 6
so, is auch alles kein Problem, bis ich n als ne sehr große zahl gesetzt hab, da bleibt das Program hängen bei ... + 1/65336 mit der fehlermeldung, ich solle doch bitte nicht durch null teilen ??

will ich doch garnich, zuerst dachte ich, dass die Zahl vllt zu groß ist, es geht aber nur mit 65336 net, mit größeren gehts (also zumindestens mal bis 99999)

Also mit dem Quelltext gehts:

Delphi-Quellcode:
var i, n: longint;
begin
n:=strtoint(edit1.text);
x:=0;
memo1.lines.Clear;
memo1.lines.Add(' 1/' + '');
for i:=2 to n do
  begin
  //memo1.lines.Add('+1/' + inttostr(i)+ '²');
    if i = 65536 then else x:=x+(1/(i*i));
  end;
x:=x+1;
memo1.lines.add('=' + floattostr(x));
end;
ohne die if zeile (also nur x:=x+(1/(i*i))) bleibt er halt hängen...

wird mich wirklich ma interessieren, woran das liegt...
hm.. vllt weil 65336 = 265² = 2^16... keine Ahnung

Vielen Dank

13Joe37
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#2

Re: Problem mit überlauf bzw. division durch null

  Alt 20. Okt 2008, 15:00
Hallo,

was ist denn das für ein Konstrukt?
    if i = 65536 then else x:=x+(1/(i*i)); Besser und übersichtlicher wäre das:
    if i <> 65536 then x:=x+(1/(i*i));
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
13Joe37

Registriert seit: 15. Okt 2008
9 Beiträge
 
#3

Re: Problem mit überlauf bzw. division durch null

  Alt 20. Okt 2008, 15:02
jaa... ist mir nachher auch aufgefallen...
der code da ist allgemein noch net so richtig, ich hab auch edit1 und Button1 so gelassen, wmach ich normal auch nicht...
  Mit Zitat antworten Zitat
punkt21

Registriert seit: 6. Sep 2008
11 Beiträge
 
#4

Re: Problem mit überlauf bzw. division durch null

  Alt 20. Okt 2008, 15:08
habs nich ausprobiert, aber versuch mal anstatt longint float zu benutzen.
vllt klappts damit
  Mit Zitat antworten Zitat
HenKst

Registriert seit: 7. Jul 2008
113 Beiträge
 
#5

Re: Problem mit überlauf bzw. division durch null

  Alt 20. Okt 2008, 15:10
Zitat von 13Joe37:
Ahoihoi!!


wird mich wirklich ma interessieren, woran das liegt...
hm.. vllt weil 65336 = 265² = 2^16... keine Ahnung

Vielen Dank

13Joe37
2^16 is 65536 nich 65336

aber so stehts ja auch im code

Und du benutzt ja LongInt und nicht word.
Bei word wäre 65535+1 = 0 und 0*0=0

Hast du vllt LongInt neu definiert?
narf - not a real function
  Mit Zitat antworten Zitat
dominikkv

Registriert seit: 30. Sep 2006
Ort: Gundelfingen
1.109 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Problem mit überlauf bzw. division durch null

  Alt 20. Okt 2008, 15:12
ähm...ich hab das mal nachgeprüft:
showmessage(FloatToStr(1/(StrToInt(edt1.Text) * StrToInt(edt1.Text)))); Zuerst kam bei der Zahl 65536 (und nicht 65336) die Fehlermeldung Division durch 0, dann hab ich 35537 eingegeben -> geht.
Wenn ich jetzt aber wieder 65536 eingebe kommt die Meldung: INF (vllt Infinity?)

...komisch
Dominik
Wer anderen eine Grube gräbt, hat ein Gruben-Grab-Gerät!
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#7

Re: Problem mit überlauf bzw. division durch null

  Alt 20. Okt 2008, 15:17
Hallo,

bei mir funktioniert folgender Code:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  i, n: longint;
  x : Real;
begin
  n := StrToIntDef(Edit1.text, 10);
  x := 0;

  memo1.lines.Clear;

  memo1.lines.Add(' 1/' + '');

  for i := 2 to n do
    begin
      memo1.lines.Add('+1/' + inttostr(i)+ '²');
      If i < 65536 then
        x := x + (1 / (i * i))
      else
        break;
    end;

  x := x + 1;

  memo1.lines.add('=' + floattostr(x));
end;
[Edit]
Der Code geht nicht bei 65536 als Eingabe.
Division durch Null als Meldung

Ich hab auch rausgefunden warum:
65536 * 65536 = 4294967296

Und 4294967296 ist sogar für ein LongWord zu lang
ein LongWord geht von 0...4294967295
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
HenKst

Registriert seit: 7. Jul 2008
113 Beiträge
 
#8

Re: Problem mit überlauf bzw. division durch null

  Alt 20. Okt 2008, 15:29


2^16*2^16 =2^32 = 0 :=)

also wenn i 65536 ist und mit sich selbst mutlipliziert wird kommt 2^32 raus
und da die oberen bits abgeschnitten werden ist das im longint nunmal leider 0^^
narf - not a real function
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#9

Re: Problem mit überlauf bzw. division durch null

  Alt 20. Okt 2008, 15:29
Hallo,

da hast Du quasi einen Rechenfehler:

i ist ein LongInt und der kann Werte bis maximal 2147483647 annehmen.

65536 * 65536 ist aber 4294967296, das ist doch ein bisserl mehr, als in i reinpasst.
Weißt Du nun i einen Wert größer als 2147483647 zu, so tritt der Effekt auf, dass alle Bits, die zuviel sind, links rüberkippen und nicht berücksichtigt werden.

Schreib Dir mal 'ne Testprogramm mit folgendem Aufbau:
Delphi-Quellcode:
Var
          l : LongInt;
          d : Double;
begin
  // erster Test
  l := 2147483647; // Mehr geht nicht in LongInt
  ShowMessage(IntToStr(l));
  l := l + 1; // und jetzt tuen wir da einen mehr rein, als reingeht.
  ShowMessage(IntToStr(l));
  // zweiter Test
  l := 2147483647; // Mehr geht nicht in LongInt
  l := l + l; // und das addieren wir zu uns selbst (= 2 * mehr geht nicht)
  ShowMessage(IntToStr(l));
  l := l + 2; // und da tuen wir jetzt noch zwei drauf
  ShowMessage(IntToStr(l));
  // dritter Test
  d := 2147483647; // Mehr geht nicht in LongInt
  d := d + 2147483647; // Mehr geht nicht in LongInt + Mehr geht nicht in LongInt
  d := d + 2; // + 2
  ShowMessage(FloatToStr(d));
  // vierter Test
  d := 65536; // unser Problemwert
  d := d * 65536; // * unserem Problemwert
  ShowMessage(FloatToStr(d));
end;
und beobachte die angezeigten Ergebnisse. Danach wird Dir klar, warum 65536 * 65536 manchmal 0 ist.
Und überprüf' bei Gelegenheit mal, ob die Ergebnisse von Zahlen, die größer als 65536 bei Dir sind, wirklich stimmen.
  Mit Zitat antworten Zitat
13Joe37

Registriert seit: 15. Okt 2008
9 Beiträge
 
#10

Re: Problem mit überlauf bzw. division durch null

  Alt 20. Okt 2008, 16:46
Also zusammenfassend meint ihr, das 65536^2 = 0 ist, und wenn man halt 1/65536^2 macht, das das selbe ist wie 1/0 und das halt nicht geht?

Zitat:
Und überprüf' bei Gelegenheit mal, ob die Ergebnisse von Zahlen, die größer als 65536 bei Dir sind, wirklich stimmen
werd ich mal machen!
(versteh ich das jetzt richtig: wenn ich 65536^2 +1 eingebe, rechnet delphi praktisch mit 1, bei 65536^2 +2 = 2 usw? Dann sollte die genauigkeit des errechneten Pi's doch bei 65536^2-1 genau so groß sein wie bei 65536^2^2 oder noch gröeren Zahlen?) muss das mal gleich ausprobieren...
  Mit Zitat antworten Zitat
Antwort Antwort
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 20:12 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