AGB  ·  Datenschutz  ·  Impressum  







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

Trunc() probleme

Ein Thema von day · begonnen am 18. Apr 2008 · letzter Beitrag vom 18. Apr 2008
Antwort Antwort
Seite 1 von 2  1 2      
day

Registriert seit: 10. Mai 2004
223 Beiträge
 
#1

Trunc() probleme

  Alt 18. Apr 2008, 08:14
Hallo,
folgendes Problem tritt bei mir auf:

Ich habe einen Double-Wert den ich je nach Präzision mit dem Faktor 10^präzision multipliziere. Anschliessend möchte ich nur noch den Integeranteil des double wertes.

Delphi-Quellcode:
Weight := 2.4353000;
Weight := Weight * Power( 10, Präzision);

Double1 := Weight ;
Double2 := Trunc( Weight );
Angenommen wir haben eine Präzision von 4, dann ist der Wert (den ich im Debugger sehe) bei Double1 = 24353. Der Wert in Double2 ist allerdings 24352. Was mache ich falsch?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#2

Re: Trunc() probleme

  Alt 18. Apr 2008, 08:20
Versuch es mal mit Int() statt Trunc().
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
day

Registriert seit: 10. Mai 2004
223 Beiträge
 
#3

Re: Trunc() probleme

  Alt 18. Apr 2008, 08:48
Hallo,
Bei int bekomme ich einen compiler fehler: incompatible types: integer and extended
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Trunc() probleme

  Alt 18. Apr 2008, 09:13
Wie wäre es wenn Du aus Double2 einen Integertypen machst.
Weil trunc liefert einen Integer zurück und ich nehme an,
dass Double2 ein Extended Type ist.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
blink182

Registriert seit: 19. Jun 2007
126 Beiträge
 
Delphi 5 Standard
 
#5

Re: Trunc() probleme

  Alt 18. Apr 2008, 09:16
dem kann ich zustimmen
aber ich würde vllt. round( ) nehmen, da trunc immer abrundet, es sei denn es ist so gewollt und Präzision ohne ä schreiben also mit ae oder so und aufpassen, dass der wert nicht zu hoch wird, mit dem du potenzierst
  Mit Zitat antworten Zitat
Nuclear-Ping
(Gast)

n/a Beiträge
 
#6

Re: Trunc() probleme

  Alt 18. Apr 2008, 09:24
Alternativ wäre vielleicht noch Floor und Ceil zu nennen, aus der Unit Math.
  Mit Zitat antworten Zitat
day

Registriert seit: 10. Mai 2004
223 Beiträge
 
#7

Re: Trunc() probleme

  Alt 18. Apr 2008, 09:27
Hallo,
Ja das abschneiden ohne runden ist gewollt. Aber kann mir einer Erklären warum das nicht funktioniert.


Delphi-Quellcode:

procedure TForm1.RzMemo1Click(Sender: TObject);
var lTemp3 : Double;
lTemp2 : Double;
lTemp1 : Double;
begin
  lTemp3 := 2.4353000;
  lTemp2 := Power(10,4);
  lTemp1 := lTemp3*lTemp2;

  lTemp2 := Trunc(lTemp1);

  RzMemo1.Lines.Add(FloatToStr(lTemp1));
  RzMemo1.Lines.Add(FloatToStr(lTemp2));

end;
lTemp1 ist 24353
lTemp2 ist 24352


edit:
Habe auch das ganze mit int versucht, aber gleiches Resultat

Delphi-Quellcode:
procedure TForm1.RzMemo1Click(Sender: TObject);
var lTemp3 : Double;
lTemp2 : Double;
lTemp1 : Double;
lInt : Int64;
begin
  lTemp3 := 2.4353000;
  lTemp2 := Power(10,4);
  lTemp1 := lTemp3*lTemp2;

  lInt := Trunc(lTemp1);

  RzMemo1.Lines.Add(FloatToStr(lTemp1));
  RzMemo1.Lines.Add(IntToStr(lInt));

end;

end.
  Mit Zitat antworten Zitat
oldmax

Registriert seit: 27. Apr 2006
Ort: Gieboldehausen
167 Beiträge
 
#8

Re: Trunc() probleme

  Alt 18. Apr 2008, 09:38
Hi

Zitat:
Delphi-Quellcode:
Weight := 2.4353000;
Weight := Weight * Power( 10, Präzision);

Double1 := Weight ;
Double2 := Trunc( Weight );
Versuchmal folgendes :

Double2 := Trunc( Weight+0.00001); Der Grund ist, das es bei Double oft eine Ungenauigkeit im Bitmuster gibt (niederwertigste Stelle) Ich hab mal noch unter Turbo mir die Zähne dran ausgebissen, eine Abfrage
If 4/4=Trunc(4/4) then // Zahlen waren natürlich Variablen nie das richtige Ergebnis brachte.
Ich kann mich auch irren, aber den Versuch solltest du mal starten. Die Zahl, die du addierst, kann so klein sein, das sie dein Ergebnis nicht verfälscht.
Gruß oldmax
Noch ist mein Rechner mir zu Diensten.... ansonsten habe ich die Macht ihn zu vernichten !
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#9

Re: Trunc() probleme

  Alt 18. Apr 2008, 09:41
Zitat von day:
lTemp2 ist 24352
Bei einem kleinen Test kam bei mir heraus: lTemp2 ist 24352,9. Also solltest Du mal den Vorschlag von oldmax ausprobieren.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
day

Registriert seit: 10. Mai 2004
223 Beiträge
 
#10

Re: Trunc() probleme

  Alt 18. Apr 2008, 09:45
Hallo,
Ja wenn ich 0.0000000001 zum Wert addieren dann geht es. Aber ich kann mir das trotzdem nicht erklären, denn ich schneide ja die stellen nach dem komma ab, womit doch die niederwertigsten bits nicht mehr berücksichtigt werden sollten.

edit:
Irgendwie ist mir diese Lösung nicht so sympatisch. Gibt es vielleicht noch andere Möglichkeiten oder ist dies das normale Vorgehen um dieses Problem zu lösen?
  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:27 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