AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

trunc(2)=1?

Ein Thema von num_ber_3 · begonnen am 11. Nov 2003 · letzter Beitrag vom 11. Nov 2003
Antwort Antwort
Seite 1 von 2  1 2      
num_ber_3

Registriert seit: 9. Nov 2003
3 Beiträge
 
#1

trunc(2)=1?

  Alt 11. Nov 2003, 14:28
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?

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

mfg
  Mit Zitat antworten Zitat
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#2

Re: trunc(2)=1?

  Alt 11. Nov 2003, 14:32
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.
gruß, choose
  Mit Zitat antworten Zitat
axelf98

Registriert seit: 27. Aug 2003
Ort: Ennepetal
440 Beiträge
 
Delphi 2005 Personal
 
#3

Re: trunc(2)=1?

  Alt 11. Nov 2003, 14:36
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.)
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: trunc(2)=1?

  Alt 11. Nov 2003, 14:38
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.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
num_ber_3

Registriert seit: 9. Nov 2003
3 Beiträge
 
#5

Re: trunc(2)=1?

  Alt 11. Nov 2003, 14:52
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.
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#6

Re: trunc(2)=1?

  Alt 11. Nov 2003, 14:58
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;
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: trunc(2)=1?

  Alt 11. Nov 2003, 15:01
Es gibt Rechner, die das richtig ausrechnen

Oder sollte es if a =99.99 heißen
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
num_ber_3

Registriert seit: 9. Nov 2003
3 Beiträge
 
#8

Re: trunc(2)=1?

  Alt 11. Nov 2003, 15:01
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?
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#9

Re: trunc(2)=1?

  Alt 11. Nov 2003, 15:03
Zitat von Chewie:
Es gibt Rechner, die das richtig ausrechnen

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.
  Mit Zitat antworten Zitat
Tpercon

Registriert seit: 7. Jun 2002
638 Beiträge
 
Delphi 5 Professional
 
#10

Re: trunc(2)=1?

  Alt 11. Nov 2003, 15:04
Zitat von Chewie:
Es gibt Rechner, die das richtig ausrechnen

Oder sollte es if a =99.99 heißen
Schau mal:
  a := a - b; kommt zweimal vor.
  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 03:35 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