Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi trunc(2)=1? (https://www.delphipraxis.net/11660-trunc-2-%3D1.html)

num_ber_3 11. Nov 2003 14:28


trunc(2)=1?
 
tach allerseits,
jeder von euch kennt die funktione trunc, nehme ich mal an. sie schneidet einem flieskommawert die nachkommastellen ab und gibt einen integerwert zurück (die zahlen vor dem komma).
ich habe beim programmieren festgestellt, dass dies nicht immer so korrekt geschieht.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var       h,z,anfang:double;
begin
 z:=9*(1/24);
 anfang:=7*(1/24);
 h:=(z-anfang) / (1/24);
 showmessage('fliesskomma: ' + floattostr(h) + chr(13) + 'trunc: ' + inttostr(trunc(h)));
end;
die message sieht bei mir so aus:
"fliesskomma: 2
trunc:1
"
seit wann ist trunc(2) = 1? :wiejetzt:

achja, wenn ich die rechnung mit numerischen näherungswerten (0.375 für z und 0.291666666 für anfang) durchführe gehts.

mfg

choose 11. Nov 2003 14:32

Re: trunc(2)=1?
 
Eine genaue Aussage könnte ich nur mit konkreten Zahlen treffen, ich gehe aber davon aus, dass es sich um ein Problem handelt, dessen Ursache bei einem Hier im Forum suchenRundungsfehler zu suchen ist.

axelf98 11. Nov 2003 14:36

Re: trunc(2)=1?
 
Das ist ein Rundungsfehler, den ich auch schon mal hatte. Ich hab das damals ungefähr so gelöst:

Delphi-Quellcode:
function geraderunden(X:real): real;
begin
 Result := strtofloat(floattostr(X));
end;


procedure TForm1.Button1Click(Sender: TObject);
var       h,z,anfang:double;
begin
z:=9*(1/24);
anfang:=7*(1/24);
h:=(z-anfang) / (1/24);
h := geraderunden(h);
showmessage('fliesskomma: ' + floattostr(h) + chr(13) + 'trunc: ' + inttostr(trunc(h)));
end;
(Ich weiss, dass das nicht besonders schön ist, aber es funktioniert.)

Chewie 11. Nov 2003 14:38

Re: trunc(2)=1?
 
Das hängt wohl damit zusammen, dass Fließkommatypen immer mit einer gewissen Ungenauigkeit gespeichert werden. Im vorliegenden Fall wird die Zahl wohl irgendwie als 1.999999999999 oder so gespeichert.

num_ber_3 11. Nov 2003 14:52

Re: trunc(2)=1?
 
also den mit der ungenauigkeit find ich ein bisschen suspekt. weil FLOATtoSTR(h)='2'... und das ist ja auch korrekt. jedenfalls ist 2 die richtige lösung, kann man leicht nachrechnen.

stoxx 11. Nov 2003 14:58

Re: trunc(2)=1?
 
Zitat:

Im vorliegenden Fall wird die Zahl wohl irgendwie als 1.999999999999 oder so gespeichert
nicht nur irgendwie, nein sie WIRD so gespeichert ;-)

möchte nur noch etwas hinzufügen,
.. dass dieser Fall sogar schon bei ganz einfachen operationen eintreten kann.

Jeder kann mal folgendes Beispiel probieren.

Bei mir kommt da schon die Meldung, dass die Zahlen ungleich wären. Was natürlich nach Adam Ries nicht stimmt.
Beachten sollte man, dass dies sogar vom Prozessor abhängig ist.
Wir haben das mal getestet, es gibt Computer, die rechnen dieses Beispiel "richtig" und andere wiederum "falsch"
ist von Computer zu Computer anders. (Co-Prozessor).

Was denkst Du, warum Brücken einstürzen ? *g* .. Tja, die Computer sind schon grausam, was die so alles mit uns machen ...


Code:
procedure TForm1.Button1Click(Sender: TObject);
var a, b : double;
begin

  a := 100;
  b := 0.01;

  a := a - b;
  a := a - b;

  if a = 99.98 then showmessage('Gleich') else showmessage('ungleich');

end;

Chewie 11. Nov 2003 15:01

Re: trunc(2)=1?
 
Es gibt Rechner, die das richtig ausrechnen :shock:

Oder sollte es if a =99.99 heißen :?

num_ber_3 11. Nov 2003 15:01

Re: trunc(2)=1?
 
naja. scheint wohl auf ne ziemlich hässliche umgehung des problems à la STRtoFLOAT(FLOATtoSTR(h)) herauszulaufen.
danke für die schnelle hilfe

ps: liegst vielleicht nur am betriebssystem? :gruebel:

stoxx 11. Nov 2003 15:03

Re: trunc(2)=1?
 
Zitat:

Zitat von Chewie
Es gibt Rechner, die das richtig ausrechnen :shock:

Oder sollte es if a =99.99 heißen :?


nein, Du ziehst 0.01 zweimal von 100 ab :-) .. dann kommst Du auf 99.98 .. hey .. ich hatte mathe leistungskurs !! *g*
schon dann erkennt der Computer keine gleichheit mehr.

Tpercon 11. Nov 2003 15:04

Re: trunc(2)=1?
 
Zitat:

Zitat von Chewie
Es gibt Rechner, die das richtig ausrechnen :shock:

Oder sollte es if a =99.99 heißen :?

Schau mal:
Delphi-Quellcode:
  a := a - b;
kommt zweimal vor. :zwinker:


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:42 Uhr.
Seite 1 von 2  1 2      

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