Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Berechnungen (0.2400001 * 0.7500009) scheitern in Delphi 5 (https://www.delphipraxis.net/128481-berechnungen-0-2400001-%2A-0-7500009-scheitern-delphi-5-a.html)

john84 30. Jan 2009 16:12


Berechnungen (0.2400001 * 0.7500009) scheitern in Delphi 5
 
Hallo zusammen,
mir ist gerade ein Problem im Zusammenhang mit einer if aufgefallen evtl. kenn jemand das Problem

folgendes if scheitert immer:

Delphi-Quellcode:
if((0.2400001 + 0.7500009)*100 = 100)
wurde immer wegen false übersprungen. Nach weiterem Rumspielen mit werten kamen die wildesten ergebnisse Raus so ist

75.004 = 0.7500004*100 = true
75.005 = 0.7500005*100 = true
75.006 = 0.7500006*100 = false
75.007 = 0.7500007*100 = true
75.008 = 0.7500008*100 = false
75.009 = 0.7500009*100 = true

Ich danke für eure Antwort
Johnny

mkinzler 30. Jan 2009 16:14

Re: Berechnungen (0.2400001 * 0.7500009) scheitern in Delphi
 
Lass dir mal das Zwischenergebnis vor der Evaluation anzeigen

john84 30. Jan 2009 16:24

Re: Berechnungen (0.2400001 * 0.7500009) scheitern in Delphi
 
Hey vielen dank für die schnelle Antwort ist ja klasse.

Aber hä :oops: ? Sorry verstehe ich nicht zeigt mir dann alle Rechenschritte an? Wie kann ich mir das Zwischenergebnis ausgeben lassen? Ich nutze immer dieses kleine "Watch" Fenster was mir mittels ctrl + F7 angezeigt wird.

mkinzler 30. Jan 2009 16:28

Re: Berechnungen (0.2400001 * 0.7500009) scheitern in Delphi
 
Was ergibt den 0.2400001 + 0.7500009)*100? (Könnte ien Rundungsproblem sein)

himitsu 30. Jan 2009 16:39

Re: Berechnungen (0.2400001 * 0.7500009) scheitern in Delphi
 
Ganz einfach ... schonmal was von Rundungsfehlern gehört?

die ganzen Fließkommatypen haben 'nen bestimmten werteberech und vorallem eine gewisse Genauigkeit, da sie nicht alle unendlichen Möglichkeiten darstellen können

Meflin 30. Jan 2009 16:40

Re: Berechnungen (0.2400001 * 0.7500009) scheitern in Delphi
 
Und was lernen wir daraus: Vergleiche niemals Floats auf = :stupid:

john84 30. Jan 2009 16:48

Re: Berechnungen (0.2400001 * 0.7500009) scheitern in Delphi
 
ich verwende den Typ extended da sollten doch wohl 7 Nachkommastellen noch keine Probleme machen oder?

Meflin 30. Jan 2009 16:50

Re: Berechnungen (0.2400001 * 0.7500009) scheitern in Delphi
 
Zitat:

Zitat von john84
ich verwende den Typ extended da sollten doch wohl 7 Nachkommastellen noch keine Probleme machen oder?

http://www.michael-puff.de/Artikel/Fliesskomma.shtml

...

Phoenix 30. Jan 2009 16:54

Re: Berechnungen (0.2400001 * 0.7500009) scheitern in Delphi
 
Nochmal: Fließkommazahlen haben unterschiedliche Darstellungen.

Du kannst 0,0000001 auf verschiedene Arten in einem Fließkommawert unterbringen. Alle diese Arten haben andere Bitmuster. Ein Vergleich in der CPU vergleicht Bitmuster. Du kannst Dir prinzipiell noch nichtmal sicher sein das
Delphi-Quellcode:
if (0.00000001 = 0.00000001) then TuWas();
Auch tatsächlich was tut.

Fließkommazahlen mit = zu vergleichen ist ein No-Go. Sowas tut man nicht.

Corpsman 30. Jan 2009 17:03

Re: Berechnungen (0.2400001 * 0.7500009) scheitern in Delphi
 
Um mich meinen Vorrednern an zu schliesen.

das einzige was du wenn überhaubt, machen kannst ist ein Vergleich mit Epsilonkugeln
Delphi-Quellcode:
function Gleich( v1,v2,Epsilon:Double):Boolean;
begin
  result := abs( v1-v2) <= Epsilon;
end;
Wobei du Epsilon wiederum auch nicht zu klein wählen darfst, siehe die oberen Posts.

und dann Tut
Delphi-Quellcode:
if Gleich(0.00000001 , 0.00000001, 0.001) then TuWas();
auch was ;)

taaktaak 30. Jan 2009 17:08

Re: Berechnungen (0.2400001 * 0.7500009) scheitern in Delphi
 
Was natürlich zu der problematischen Entscheidungsnotwendigkeit führt, den Wert der "Epsilonkugel" zu bestimmen.

Luckie 30. Jan 2009 17:10

Re: Berechnungen (0.2400001 * 0.7500009) scheitern in Delphi
 
Wer sich das Warum genauer angucken will: http://www.michael-puff.de/Artikel/Fliesskomma.shtml

Meflin 30. Jan 2009 17:12

Re: Berechnungen (0.2400001 * 0.7500009) scheitern in Delphi
 
Zitat:

Zitat von Luckie
Wer sich das Warum genauer angucken will: http://www.michael-puff.de/Artikel/Fliesskomma.shtml

Ließt du die Themen eigentlich auch mal durch, bevor du deine Links rausballerst :tongue:

john84 30. Jan 2009 17:26

Re: Berechnungen (0.2400001 * 0.7500009) scheitern in Delphi
 
Alles klar, bin nur Teilzeitentwickler :-) sorry.

Mich tröstet und endtäuscht zugleich nur dass hier im Haus kein Programmier davon etwas wusste.

Schöne Grüße
Johnny

john84 30. Jan 2009 17:28

Re: Berechnungen (0.2400001 * 0.7500009) scheitern in Delphi
 
Zitat:

Ließt du die Themen eigentlich auch mal durch, bevor du deine Links rausballerst Tongue
Wieso? Gibt es richtigere Lösungen? Hab ich da noch immer etwas nicht kapiert?

himitsu 30. Jan 2009 17:33

Re: Berechnungen (0.2400001 * 0.7500009) scheitern in Delphi
 
Zitat:

Zitat von john84
Wieso? Gibt es richtigere Lösungen? Hab ich da noch immer etwas nicht kapiert?

keine Soge, dieser Satz war nur an Hern Puff aka Luckie gerichtet :angel2:

Corpsman 30. Jan 2009 17:57

Re: Berechnungen (0.2400001 * 0.7500009) scheitern in Delphi
 
@ john84

Lies dir mal Post 8 durch , das dürfte es erklären.

mensch72 30. Jan 2009 19:34

Re: Berechnungen (0.2400001 * 0.7500009) scheitern in Delphi
 
nimm die funktion

SameValue
IsZero gibts glaub ich auch noch

in der Unit Math ...
die ist dafür da...

Florian H 30. Jan 2009 19:46

Re: Berechnungen (0.2400001 * 0.7500009) scheitern in Delphi
 
Zitat:

Zitat von john84
Mich tröstet und endtäuscht zugleich nur dass hier im Haus kein Programmier davon etwas wusste.

Das ist irgendwie ziemlich erschreckend O_ô
Sowas lernt man doch eigentlich, wenn man es nicht im Programmieralltag schon selbst rausgefunden hat, spätestens in den ersten paar Semestern des Informatikstudiums (Rechnerarithmetik etc).
In meinem Fall war es das dritte Semester, wo wir bis zum Erbrechen auf dem Papier mit Gleitkommazahlen (IEEE-Std.) rechnen durften :roteyes:

Edit: Das bezieht sich natürlich nicht auf dich, john84, sondern auf die Berufsprogrammierer.

Meflin 30. Jan 2009 19:56

Re: Berechnungen (0.2400001 * 0.7500009) scheitern in Delphi
 
Zitat:

Zitat von Florian H
Sowas lernt man doch eigentlich, wenn man es nicht im Programmieralltag schon selbst rausgefunden hat, spätestens in den ersten paar Semestern des Informatikstudiums

1. :mrgreen:

globetrotter77 30. Jan 2009 19:57

Re: Berechnungen (0.2400001 * 0.7500009) scheitern in Delphi
 
in diesem speziellen Fall liegt es doch wohl eher daran, dass
(0.2400001 + 0.7500009)*100
ungefähr 99 ergibt

aber abgesehen davon, ist es wirklich so, dass man bei Fließkommazahlen niemals auf Gleichheit abfragen sollte ... das ist und bleibt ein ganz elementares Problem in der Datenverarbeitung, das aus der ständigen Umwandlung von Dezimaldarstellung in binäre Darstellung und umgekehrt resultiert

FAlter 30. Jan 2009 19:58

Re: Berechnungen (0.2400001 * 0.7500009) scheitern in Delphi
 
Hi,

Gleitkommazahlen waren in der ersten Hälfte des ersten Theoriesemesters schon dran... und ich bin sogar im Studienbereich Wirtschaft untergebracht :P

Mfg
FAlter

himitsu 30. Jan 2009 20:36

Re: Berechnungen (0.2400001 * 0.7500009) scheitern in Delphi
 
wer sagt, daß ein "Berufsprogrammierer" studiert haben muß? :roll:

aber das wäre doch mal etwas, was den Schülern als Erstes beigebracht werden sollte (wo doch inzwischen soviele in der Schule ein bissl Delphi lernen) ... bleibt nur diefrage, ob die Lehrer sowas wissen :roll:

Luckie 30. Jan 2009 20:58

Re: Berechnungen (0.2400001 * 0.7500009) scheitern in Delphi
 
Zitat:

Zitat von Meflin
Zitat:

Zitat von Luckie
Wer sich das Warum genauer angucken will: http://www.michael-puff.de/Artikel/Fliesskomma.shtml

Ließt du die Themen eigentlich auch mal durch, bevor du deine Links rausballerst :tongue:

Wieso? Ist doch zum Thema oder nicht?

Meflin 30. Jan 2009 21:44

Re: Berechnungen (0.2400001 * 0.7500009) scheitern in Delphi
 
Zitat:

Zitat von Luckie
Wieso? Ist doch zum Thema oder nicht?

http://www.delphipraxis.net/internal...=995737#995737 :roll:


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:40 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