AGB  ·  Datenschutz  ·  Impressum  







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

Berechnungsfehler

Ein Thema von schand99 · begonnen am 11. Apr 2016 · letzter Beitrag vom 12. Apr 2016
Antwort Antwort
Seite 1 von 2  1 2      
schand99

Registriert seit: 7. Nov 2013
Ort: Südtirol
43 Beiträge
 
Delphi XE8 Enterprise
 
#1

Berechnungsfehler

  Alt 11. Apr 2016, 16:36
Hallo,

kann einen unschönen Berechnungsfehler beobachten.
Habe folgende Variablen:
Rohrzahl, Rohrlagen, RohrReihen, Kreisläufe: Integer
RohreProKreis: Single

Wenn nun Rohrlagen = 38, RohrReihen = 4 und Kreisläufe = 40, dann

RohrZahl := RohrLagen * RohrReihen;
RohreProKreis := RohrZahl / Kreisläufe:

Ergebnis: RohreProKreis = 3,79999995231628
Wie kommt es dazu? Das korrekte Ergebnis wäre 3,8

Hat jemand von Euch eine Ahnung was zu dieser falschen Berechnung führt?

Gruß
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Berechnungsfehler

  Alt 11. Apr 2016, 16:42
Das liegt am Datentyp Single (Float), der ist ungenau. Nimm stattdessen Extended.
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Berechnungsfehler

  Alt 11. Apr 2016, 16:45
Das liegt am Datentyp Single (Float), der ist ungenau. Nimm stattdessen Extended.
Der ist nicht ganz so ungenau ... aber eben auch noch
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
4dk2

Registriert seit: 4. Sep 2007
176 Beiträge
 
#4

AW: Berechnungsfehler

  Alt 11. Apr 2016, 16:52
Double geht auch!

Delphi Hilfe: Der Typ Extended bietet eine höhere Genauigkeit, ist aber nicht so einfach portierbar wie die anderen reellen Typen. Verwenden Sie Extended mit Bedacht, wenn Sie Datendateien anlegen, die gemeinsam und plattformübergreifend genutzt werden sollen.
sollte man sich immer merken
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.380 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Berechnungsfehler

  Alt 11. Apr 2016, 17:15

Ergebnis: RohreProKreis = 3,79999995231628
Wie kommt es dazu? Das korrekte Ergebnis wäre 3,8
wenn dir max. 4 Nachkommastellen ausreichen (sowie die Wertgrenze), dann nimm den Typ Currency, da hast Du keine solchen Probleme

Grüße
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#6

AW: Berechnungsfehler

  Alt 11. Apr 2016, 18:01
Hat jemand von Euch eine Ahnung was zu dieser falschen Berechnung führt?
Wenn dich die technischen Infos dazu interessieren: Floating Point Accuracy Problems.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von MEissing
MEissing

Registriert seit: 19. Jan 2005
Ort: Egelsbach
1.384 Beiträge
 
Delphi 12 Athens
 
#7

AW: Berechnungsfehler

  Alt 11. Apr 2016, 18:12
Achtung: Im 64-Bit Modus gibt es Extended nur als Synonym für Double....

32-Bit kann genauer rechnen, als 64 Bit

(OK: Mit 64 Bit rechne *ich* ziemlich ungenau... )
Matthias Eißing
cu://Matthias.Eißing.de [Embarcadero]
Kein Support per PN
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.081 Beiträge
 
Delphi 12 Athens
 
#8

AW: Berechnungsfehler

  Alt 11. Apr 2016, 18:15
Wobei "Rundungsfehler" hier garnicht zu vermeiden sind, egal wie groß man den Fließkommadatentyp wählt.

Am Ende muß man ganz einfach bei der Ausgabe auf das gewünschte Maß runden und darf "niemals" mit = vergleichen.

Currency "rundet" automatisch auf 4 Nachkommastellen.
Bei BCD hängt das von der Speichergröße ab. (aber maximal mit der Auflösung vom Extended, wenn man es über die FPU berechnen lässt)

PS: Bei 64 Bit ist Extended nur noch FPU-intern und steht dem Programmierer quasi außerhalb garnicht mehr zur Verfügung.
In Delphi stand es halt unter 32 Bit nur deswegen zur Verfügung, weil es ging, aber offiziell war es nicht zur Benutzung angedacht.
Drum kennen Andere sowas Großes garnicht erst. https://msdn.microsoft.com/de-de/library/cc953fe1.aspx


32-Bit kann genauer rechnen, als 64 Bit
"rechnen" tun Beide womöglich gleich, nur "speichern" halt nicht. (so lange es innerhalb der entsprechenden CPU-Register bleibt)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (11. Apr 2016 um 18:26 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

AW: Berechnungsfehler

  Alt 11. Apr 2016, 19:10
Hier noch mal auf deutsch: http://michael-puff.de/Programmierun...esskomma.shtml
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.081 Beiträge
 
Delphi 12 Athens
 
#10

AW: Berechnungsfehler

  Alt 11. Apr 2016, 19:49
DX35 kann dann bestimmt auch endlich 128 Bit.
https://msdn.microsoft.com/de-de/lib...3fe1.aspx#mt62 __int128
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  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 08:50 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