AGB  ·  Datenschutz  ·  Impressum  







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

Addieren in if Abfrage

Ein Thema von Niklas- · begonnen am 6. Feb 2008 · letzter Beitrag vom 7. Feb 2008
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von inherited
inherited

Registriert seit: 19. Dez 2005
Ort: Rosdorf
2.022 Beiträge
 
Turbo Delphi für Win32
 
#11

Re: Addieren in if Abfrage

  Alt 6. Feb 2008, 19:31
Zitat von Niklas-:
das ist auch der Grund warum ich extended genommen habe
Auch extended hat da nur bedingt größere Genauigkeit. WIllst du zum Beispiel die Zahl 0,2 Binär darstellen, so wird auch hier kein exaktes Eregbis bei rauskommen. Denn wenn man den Nachkommaanteil ins Binärsystem umrechnen möchte:
0,2*2=0,4 -0 MSB
0,4*2=0,8 -0
0,8*2=1,6 -1
0,6*2=1,2 -1
0,2*2=0,4 -0 LSB
usw, du siehst es ist kein Ende in Sicht, das Spielchen könnte man ewig so weiter treiben.
Andere Zahlen hingegen lassen sich sehr gut Darstellen, wie zB 0,5
0,5*2=1 -1 MSB/LSB
Du kannst auch Spaßeshalber mal einem Float-Wert zB 0,2 zuweisen, einen haltepunkt auf die Zeile dahinter setzen und dir das Ergebnis im Debugger anschauen.
Nikolai Wyderka

SWIM SWIM HUNGRY!
Neuer Blog: hier!
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#12

Re: Addieren in if Abfrage

  Alt 6. Feb 2008, 19:36
Wer keine Math-Unit hat, der kann sich leicht einen eigenen Epsilon-Test implementieren:

Delphi-Quellcode:
function IsZero(value: Extended; epsilon: Extended = 0): Boolean;
begin
  if epsilon = 0
    then epsilon := 1E-15
    else epsilon := Abs(epsilon);
  Result := Abs(Value) <= epsilon;
end;

function IsEqual(value1, value2: Extended): Boolean;
begin
  Result := IsZero(value1 - value2);
end;
  Mit Zitat antworten Zitat
Niklas-

Registriert seit: 24. Dez 2007
11 Beiträge
 
#13

Re: Addieren in if Abfrage

  Alt 6. Feb 2008, 20:19
Danke für die extrem schnelle und gute Hilfe!!

Für meine Zwecke reicht extended erstmal, es ging nur darum per Bruteforce das hier zu lösen:
a+b+c+d=9,27
a*b*c*d=9,27

Da es sich um einen Wettbewerb der TU Freiberg handelt, habe ich bewusst andere Zahlen genommen um anderen Mitspielern nicht die freude zu verderben.

Und den Algorithmus habe ich ja alleine geschrieben nur das er, aus mir bis dahin unersichtlichen Gründen, nicht funktioniert hat.

Danke nochmal!

Ich habe jetzt auch verstanden warum das ganze in delphi bzw in anderen Programmiersprachen bzw im Binärsystem so schwer ist.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#14

Re: Addieren in if Abfrage

  Alt 7. Feb 2008, 00:24
Ich verweise da mal auf Delphi-Referenz durchsuchenSameValue(), damit man nicht anfängt durch die hier gebotenen Lösungen das Rad neu zu erfinden, soweit die Funktion denn vorhanden ist.
  Mit Zitat antworten Zitat
Benutzerbild von Xong
Xong

Registriert seit: 9. Jan 2008
186 Beiträge
 
Delphi 2006 Professional
 
#15

Re: Addieren in if Abfrage

  Alt 7. Feb 2008, 07:28
Zitat von marabu:
Wer keine Math-Unit hat, der kann sich leicht einen eigenen Epsilon-Test implementieren:
Das geht wesentlich kürzer. =)
Delphi-Quellcode:
function IsZero(value: Extended; epsilon: Extended = 1E-15): Boolean;
begin
  Result := Abs(Value) <= Abs(epsilon);
end;

function IsEqual(value1, value2: Extended): Boolean;
begin
  Result := IsZero(value1 - value2);
end;
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#16

Re: Addieren in if Abfrage

  Alt 7. Feb 2008, 13:49
Hallo Xong,

die Signatur von IsZero() war bei mir von der Unit Math vorgegeben. Die von dir eingeführte Eleganz hat den Nachteil, dass der Fall Epsilon = 0 zugelassen wird - genau das aber wollen wir alle in diesem Thread verhindern.

Übrigens: Math.SameValue() liefert falsche Ergebnisse, sobald ein negativer Wert für Epsilon übergeben wird, weil intern kein Absolutbetrag gebildet wird.

Freundliche Grüße
  Mit Zitat antworten Zitat
Benutzerbild von Xong
Xong

Registriert seit: 9. Jan 2008
186 Beiträge
 
Delphi 2006 Professional
 
#17

Re: Addieren in if Abfrage

  Alt 7. Feb 2008, 13:55
Zitat von marabu:
Die von dir eingeführte Eleganz hat den Nachteil, dass der Fall Epsilon = 0 zugelassen wird
Nämlich genau dann, wenn der Programmierer es möchte. Will er es nicht, so übergibt er das Argument nicht. Will er Epsilon größer, kleiner oder einfach nur anders haben, so kann er es als Argument übergeben.

Und zu guter Letzt: Der Fall "0" wird zugelassen! Mir fallen dafür sogar (wenn auch nur exemplarische) Anwendungen ein. (Z.B. Überprüfung der Fehlerfortpflanzung bei mathematisch äquivalenten Termen.)

LG,
Xong

EDIT: Ich hab recht!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 16:46 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