![]() |
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:
wurde immer wegen false übersprungen. Nach weiterem Rumspielen mit werten kamen die wildesten ergebnisse Raus so ist
if((0.2400001 + 0.7500009)*100 = 100)
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 |
Re: Berechnungen (0.2400001 * 0.7500009) scheitern in Delphi
Lass dir mal das Zwischenergebnis vor der Evaluation anzeigen
|
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. |
Re: Berechnungen (0.2400001 * 0.7500009) scheitern in Delphi
Was ergibt den 0.2400001 + 0.7500009)*100? (Könnte ien Rundungsproblem sein)
|
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 |
Re: Berechnungen (0.2400001 * 0.7500009) scheitern in Delphi
Und was lernen wir daraus: Vergleiche niemals Floats auf = :stupid:
|
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?
|
Re: Berechnungen (0.2400001 * 0.7500009) scheitern in Delphi
Zitat:
![]() ... |
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:
Auch tatsächlich was tut.
if (0.00000001 = 0.00000001) then TuWas();
Fließkommazahlen mit = zu vergleichen ist ein No-Go. Sowas tut man nicht. |
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:
Wobei du Epsilon wiederum auch nicht zu klein wählen darfst, siehe die oberen Posts.
function Gleich( v1,v2,Epsilon:Double):Boolean;
begin result := abs( v1-v2) <= Epsilon; end; und dann Tut
Delphi-Quellcode:
auch was ;)
if Gleich(0.00000001 , 0.00000001, 0.001) then TuWas();
|
Re: Berechnungen (0.2400001 * 0.7500009) scheitern in Delphi
Was natürlich zu der problematischen Entscheidungsnotwendigkeit führt, den Wert der "Epsilonkugel" zu bestimmen.
|
Re: Berechnungen (0.2400001 * 0.7500009) scheitern in Delphi
Wer sich das Warum genauer angucken will:
![]() |
Re: Berechnungen (0.2400001 * 0.7500009) scheitern in Delphi
Zitat:
|
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 |
Re: Berechnungen (0.2400001 * 0.7500009) scheitern in Delphi
Zitat:
|
Re: Berechnungen (0.2400001 * 0.7500009) scheitern in Delphi
Zitat:
|
Re: Berechnungen (0.2400001 * 0.7500009) scheitern in Delphi
@ john84
Lies dir mal Post 8 durch , das dürfte es erklären. |
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... |
Re: Berechnungen (0.2400001 * 0.7500009) scheitern in Delphi
Zitat:
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. |
Re: Berechnungen (0.2400001 * 0.7500009) scheitern in Delphi
Zitat:
|
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 |
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 |
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: |
Re: Berechnungen (0.2400001 * 0.7500009) scheitern in Delphi
Zitat:
|
Re: Berechnungen (0.2400001 * 0.7500009) scheitern in Delphi
Zitat:
![]() |
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