![]() |
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:
die message sieht bei mir so aus:
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; "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 |
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
![]() |
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:
(Ich weiss, dass das nicht besonders schön ist, aber es funktioniert.)
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; |
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.
|
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.
|
Re: trunc(2)=1?
Zitat:
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; |
Re: trunc(2)=1?
Es gibt Rechner, die das richtig ausrechnen :shock:
Oder sollte es if a =99.99 heißen :? |
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: |
Re: trunc(2)=1?
Zitat:
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. |
Re: trunc(2)=1?
Zitat:
Delphi-Quellcode:
kommt zweimal vor. :zwinker:
a := a - b;
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:39 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-2025 by Thomas Breitkreuz