kostenloser Webspace werbefrei: lima-city


Problem mit While-Schleife : Variable erhöhen

lima-cityForumProgrammiersprachenDelphi & Pascal

  1. Autor dieses Themas

    nordy

    nordy hat kostenlosen Webspace.

    Wenn ich auf Button1 klick, dann gibt er mir im Edit1 für u = 1,08646184497817E-311 aus.
    Wie kann so eine Zahl zustanden kommen, wenn ich sie nur um 0.01 erhöhe und die Bedingung u<=3 ist?

    procedure TForm1.Button1Click(Sender: TObject);
    var u, x, flaeche : double;
    begin
    while (flaeche >= x) and (u<=3) do
    begin
    x:=flaeche;
    u:=u+0.01;
    flaeche := (u + u)*(-(u*u)+9);
    end;
    edit1.text:= floattostr(u);
    end;
    
    
    end.
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Autor dieses Themas

    nordy

    nordy hat kostenlosen Webspace.

    seltsam oder?

    Edit by patrick91:
    Text aus zweitem Post: so etwas kann gar nicht sein...




    Beitrag geändert: 10.6.2007 19:29:44 von patrick91
  4. hm... also erstma solltest du hier nich 5 ma posten "komisch, oder.." gulden kannst auch anders sammeln, mit qualitativen beiträgen...

    zum thema...

    welches delphi nutz du?

    du solltest ma, auch der variable x, u, flaeche vorher nen wert zuweisen, bevor du die vergleichen willst... denke ma, das bringt bei dir die schleife durcheinander... weil was soll er denn in der abbruchbedingung die flaeche mit x prüfen, wenn denen überhaupt kein wert zugewiesen wurde... ich weis ja nich, wie dein script weiter aufgebaut is... aber so funkt das nich...

    mfg
  5. Autor dieses Themas

    nordy

    nordy hat kostenlosen Webspace.

    ok, das stimmt, is mir gar nicht aufgefallen,aber hier hab ich noch ein einfacheren code, bei dem für x 10,0099999999998 ausgegeben wird. das kann auch nicht sein , ich benutz übrigens delphi 5

    procedure TForm1.Button1Click(Sender: TObject);
    var x :double;
    begin
    x:=0;
    
    while x <=10 do
    begin
    x:=x+0.01;
    end;
    edit1.text:=floattostr(x);
    end;
    end.


    Beitrag geaendert: 28.5.2007 12:38:57 von nordy
  6. p********c

    versuch mal x nicht 0 sondern 0,0 zu zuweisen! Du musst ner double variable auch einen double wert zuweisen! Dann sollte es klappen.
  7. Hallo,
    die Sache ist die:
    Dezimalbrüche lassen sich im Binärsystem nicht genau darstellen.
    Der Dezimalbruch setzt sich aus Potenzen von 2 zusammen.
    Will man z.B. 0,1 darstellen, so mancht man das wie folgt:
    2^-1 = 0,5 zu groß
    2^-2 = 0,25 zu groß
    2^-3 = 0,125 zu groß
    2^-4 = 0,0625 zu klein, also brauche ich noch 0,0375
    2^-5 = 0,03125 kleiner als 0,0375 als brauche ich noch 0,0375 -0,03125 = 0,00625
    2^-6 = 0,015625 zu groß also weiter

    usw.

    die Potenzen, die ich brauche erhalten in meiner Double Zahl (= 64 Bit) eine 1, der Rest eine 0. (Wobei 10 Bit noch für die Stelle des Kommas im Float verwendet werden).
    Auf jeden Falls solltest du dir nach den obrigen Ausführungen vorstellen können, dass die 0,1 nicht ganz genau dargestellt werden kann, da aufgrund der begrenzen Anzahl der Stellen eine kleine Ungenauigkeit bleibt. So kommte es, dass in deinem Beispiel die 10,01 halt 10,0099999999998 ist. Die Funktion floattostr() wandelt 15 signifikante Stelle (ohne führende Nullen) um. Dann sieht es so aus wie du es festgestellt hast. Du könntest die Darstellung mit floattostrf() verschönern.
    Ich hoffe das hilft dir und du liest dir das hier mal in Ruhe durch, wenn ich mich schon hinsetze und tippe ;).

    Gruß
    Manni
  8. rechne mit integern und teil erst das ergebnis durch 100 bzw in der fläche 10 000 (100^2)
    das ist weniger verwirrt.

    ausserdem solltest du floattostrF(>zahl<,ffnumber,>stellen vor dem komma<,>stellen nach dem komma< );verwenden

    Beitrag geändert: 17.6.2007 17:11:18 von hanstool
  9. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!