Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Lineare Funktion (https://www.delphipraxis.net/30481-lineare-funktion.html)

Spurius 25. Sep 2004 14:07


Lineare Funktion
 
Hallo,
warum funktioniert dieser Code nicht?
Delphi-Quellcode:
round(strtofloat(m.Text)* i + StrToFloat(t.Text));
Wenn ich z.B. für m = 0,5 einsetzte und füt t = -1, kommt als y Wert 0 heraus.
Die x - und Y-Werte entnehme ich aus Edits. Wenn ich dort 0.5 eingebe, kommt die Meldung:

Im Projekt Project1.exe ist eine Exception der Klasse EConvertError aufgetreten. Meldung: ''0.5' ist kein gültiger Gleitkommawert'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.

Wenn ich 0,5 eingebe, kommt keine Fehlermeldung, aber vllt liegt es ja daran, dass o,5 anstatt 0.5 dasteht. Weiss vllt jemand, wie ich dieses Problem lösen kann?

Gruß
Spurius

Ultimator 25. Sep 2004 14:08

Re: Lineare Funktion
 
Ich glaube, es ist so, dass du im Code für Gleitkommawerte das Komma als Punkt (.) schreiben musst, in den Edits zur Laufzeit jedoch ein Komma (,) eingeben musst.

Spurius 25. Sep 2004 14:19

Re: Lineare Funktion
 
Mach ich ja, nur warum kommt was falsches dabei raus?

ibp 25. Sep 2004 14:32

Re: Lineare Funktion
 
Zitat:

Zitat von Spurius
Hallo,
Delphi-Quellcode:
round(strtofloat(m.Text)* i + StrToFloat(t.Text));
Wenn ich z.B. für m = 0,5 einsetzte und füt t = -1, kommt als y Wert 0 heraus.
Die x - und Y-Werte entnehme ich aus Edits. Wenn ich dort 0.5 eingebe, kommt die Meldung:


round(0.5)=1
wie groß ist i ? =1 ?

dann: round(0.5)*1+(-1)=1-1=0 ist doch richtig gerechnet!

ibp 25. Sep 2004 14:35

Re: Lineare Funktion
 
aber achtung round() unterliegt dem "Banker’s Rounding" :!:

dizzy 25. Sep 2004 14:41

Re: Lineare Funktion
 
Zitat:

Zitat von ibp
Zitat:

Zitat von Spurius
Hallo,
Delphi-Quellcode:
round(strtofloat(m.Text)* i + StrToFloat(t.Text));
Wenn ich z.B. für m = 0,5 einsetzte und füt t = -1, kommt als y Wert 0 heraus.
Die x - und Y-Werte entnehme ich aus Edits. Wenn ich dort 0.5 eingebe, kommt die Meldung:


round(0.5)=1
wie groß ist i ? =1 ?

dann: round(0.5)*1+(-1)=1-1=0 ist doch richtig gerechnet!

Vorsicht, das round ist überm ganzen Ausdruck:

round(0.5 * 1 + -1) = round(-0.5) = 0 -> da Delphi bei +/-n,5 zu n rundet, und wohl nicht zu n+1. Das wird an der immer wieder einfließenden Ungenauigkeit von Fießkommazahlen liegen (0,5000000000000000001 wird grad noch zu 1 gerundet, 0,5 nicht mehr).


gruss,
Fabian

ibp 25. Sep 2004 14:55

Re: Lineare Funktion
 
Zitat:

Zitat von dizzy
Vorsicht, das round ist überm ganzen Ausdruck:

.. stimmt hast recht ! :wall:

Zitat:

Zitat von dizzy
round(0.5 * 1 + -1) = round(-0.5) = 0 -> da Delphi bei +/-n,5 zu n rundet, und wohl nicht zu n+1. Das wird an der immer wieder einfließenden Ungenauigkeit von Fießkommazahlen liegen (0,5000000000000000001 wird grad noch zu 1 gerundet, 0,5 nicht mehr).

nein, wie bereits gesagt unterliegt round dem "Banker’s Rounding", d.h. es wird zur nächsten ganzen geraden zahl gerundet!

Spurius 25. Sep 2004 15:08

Re: Lineare Funktion
 
Hm, und wie kann ich das Problem jetzt lösen?

dizzy 25. Sep 2004 15:09

Re: Lineare Funktion
 
Zitat:

Zitat von ibp
nein, wie bereits gesagt unterliegt round dem "Banker’s Rounding", d.h. es wird zur nächsten ganzen geraden zahl gerundet!

Und wie kommt dann das:
Zitat:

Zitat von ich
0,5000000000000000001 wird grad noch zu 1 gerundet, 0,5 nicht mehr

Die nächste gerade Zahl von 0,5000000000000000001 aus ist immer noch 0, aber Delphi macht ne 1 draus. Mich würde es auch stark irritieren, wenn z.B. 3,1 zu 4 gerundet würde, da 4 ja näher liegt als die 2, und 3 ist ungerade... Ich glaube, da stimmt was nicht.
Normalerweise wird zur nächsten ganzen Zahl gerundet, egal ob gerade oder ungerade. Da von n,5 aus aber beide umgebenden ganzen Zahlen gleich "weit weg" sind, hat man in der Mathematik definiert: n,5 wird zu n+1 gerundet. Bänker, Kaufleute und so weiter machen das z.T. anders. Also scheint Delphi bei n,5 abzurunden, obwohl das lt. mathematischer Definition nicht korrekt wäre. Bei den Bänkern dann wohl schon ;).

ibp 25. Sep 2004 15:20

Re: Lineare Funktion
 
stimmt hast recht, das mit der geraden ganzen zahl bezieht sich auf die mitte!
d.h.:

round(3.5)=4
round(4.5)=4


gruß rené


ps.: zwar ist 0 keine gerade zahl, aber es wird so interpretiert!


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:24 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 by Thomas Breitkreuz