myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Rund um die Programmierung » Fehler(?) bei der Umwandlung der Nachkommastellen einer Fließkommazahl.
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

geschlossen (weitere Infos)
Zum Ende der Seite springen  

Fehler(?) bei der Umwandlung der Nachkommastellen einer Fließkommazahl.

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
GyrosMitVielScharf
myCSharp.de-Mitglied

Dabei seit: 08.08.2017
Beiträge: 14


GyrosMitVielScharf ist offline

Fehler(?) bei der Umwandlung der Nachkommastellen einer Fließkommazahl.

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

ich benötige und erstellte - dachte ich - eine Funktion, welche den Nachkommawert einer beliebigen Zahl auf x.5 ändert.
Aus z.B. 1.0 bis 1.9 einschließlich soll 1.5 werden. Ebenso aus z.B. -1 bis -1.9 soll -1.5 werden.

Meine Funktion:

C#-Code:
float toPointFive(float wert)
{
           int x = (int) wert;

            if (wert < 0.0f)
            {
                x = Math.Abs(x);
                wert = x + 0.5f;
                wert = wert * -1f;
            }
            else
            {
                wert = x + 0.5f;
            }
            return wert;
        }

Bei allen negativen Zahlen mit .0 als Nachkommastelle tritt ein Fehler auf.
Aus -3.0 wird nicht, wie gewünscht, -3.5 sondern -2.5, aus -2.0 wird -1.5.
-3.1 bis -3.9 werden zu -3.5, nur -3.0 nicht.

Habt Ihr eine Idee, woran das liegen mag?
Ich weiß jedenfalls nicht mehr weiter.

Vielen Dank für Eure Hilfe.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von GyrosMitVielScharf am 21.08.2019 14:37.

21.08.2019 14:36 Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 14.025
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Magst Du dem Forum auch den Fehler verraten, oder sollen wir raten?
 [Hinweis] Wie poste ich richtig? Punkt 5
21.08.2019 14:41 Beiträge des Benutzers | zu Buddylist hinzufügen
GyrosMitVielScharf
myCSharp.de-Mitglied

Dabei seit: 08.08.2017
Beiträge: 14

Themenstarter Thema begonnen von GyrosMitVielScharf

GyrosMitVielScharf ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Schau bitte nochmal in meinen Beitrag, dort findest du meine Frage.
>> Aus -3.0 wird nicht, wie gewünscht, -3.5 sondern -2.5<<
21.08.2019 14:46 Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 14.025
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Dann passt die Formulierung "tritt ein Fehler auf" nicht.

Offenbar also nur ein logischer Fehler, den Du dann problemlos via Debugging selbst finden kannst.
 [Artikel] Debugger: Wie verwende ich den von Visual Studio?
Siehst ja dann, wo Du ein .5 erwartest aber was anderes raus kommt.
21.08.2019 14:52 Beiträge des Benutzers | zu Buddylist hinzufügen
Th69
myCSharp.de-Poweruser/ Experte

avatar-2578.jpg


Dabei seit: 01.04.2008
Beiträge: 3.672
Entwicklungsumgebung: Visual Studio 2015/17


Th69 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Laß dir den Wert von x mal anzeigen - s.a.  [FAQ] Double und Float: Fehler beim Vergleich und Rundungsfehler. Durch Rundungsfehler kann hier aus Werten nahe bei -3.0 (intern also -2.9xxx) dann -2 werden.

Wie rufst du denn die Methode aus? Wenn du z.B. eine Schleife mit wert += 0.1f verwendest, dann hast du schon per se einen Rundungsfehler drin.
21.08.2019 15:02 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
GyrosMitVielScharf
myCSharp.de-Mitglied

Dabei seit: 08.08.2017
Beiträge: 14

Themenstarter Thema begonnen von GyrosMitVielScharf

GyrosMitVielScharf ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Entschuldige, aber
a) hast du meinen Beitrag komplett verstehend gelesen?
b) willst du mich hier nur maßregeln oder kommt noch etwas konstruktives von dir?

In der Überschrift steht ein (?) hinter "Fehler".
Den offenbar logischen Fehler finde ich ja eben nicht, sonst würde ich hier bestimmt nicht schreiben, weil, Zeit ist Geld.

Ausgabe sagt: wert = -3.0 und wird zu -2.5 anstatt, wie logischerweise erwartet, -3.5.

So.
Klar genug?
Für würdig befunden, darüber nachzudenken?
Den Code mal selbst ausführen?
Eine Idee?

Danke.
21.08.2019 15:05 Beiträge des Benutzers | zu Buddylist hinzufügen
GyrosMitVielScharf
myCSharp.de-Mitglied

Dabei seit: 08.08.2017
Beiträge: 14

Themenstarter Thema begonnen von GyrosMitVielScharf

GyrosMitVielScharf ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Danke, Th69, das ist eine sinnvolle Antwort.

Werde ich gleich überprüfen.

Danke sehr.
21.08.2019 15:10 Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 14.025
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von GyrosMitVielScharf:
Den offenbar logischen Fehler finde ich ja eben nicht, sonst würde ich hier bestimmt nicht schreiben, weil, Zeit ist Geld.

Wenn Du Dich ordentlich ausdrücken würdest, hätte man auch verstanden, was Du meinst.
Du hast deutlich von "es tritt ein Fehler auf" gesprochen, was nicht der Tatsache entspricht.
Es ist nichts anderes als ein logischer Fehler: es kommt nicht das raus, was Du erwartest.
Das ist aber alles andere als "ein Fehler, der auftritt".

Selbstverständlich kannst Du - wie Du es hier deutlich zeigst - grundreizend antworten.
Das Resultat ist verständlicherweise: Ablehnung. Die Leute werden Dir weniger antworten - Zurecht.

Auch meine Zeit ist was wert - trotzdem hab ich sie mir genommen, um zu antworten und Dir zu helfen.
Es war eine Nachfrage, was der Fehler ist, weil Du Dich entsprechend undeutlich ausgedrückt hast.

Zitat von GyrosMitVielScharf:
Den Code mal selbst ausführen?

Das ist nicht die Aufgabe eines Forums.
Wenn Du denkst, dass Du das Debugging auf das Forum abwälzen kannst, dann haste Dich halt einfach geschnitten. Auch die Helfer verwenden Zeit, die was wert ist.
So läuft das hier nicht. So läuft das prinzipiell in keinem Forum.

Daher steht dies auch ausdrücklich in den Regeln, auf die ich Dich aufmerksam gemacht habe. Auch in anderen Foren.
Denn dieser Fehler hier, ein logischer Fehler, kannst Du selbst rausfinden.

Auch den von Th69 genannten Rundungsfehler wirste per Debugging herausfinden können; er hat Dich inhaltlich damit ebenfalls auf eigenes Debugging hingewiesen.
Ein Forum dient auch der Hilfe zur Selbsthilfe. Wenn Du das in der Form nicht akzeptierst, und lieber Helfer bepöbelst, die ihre eigene wertvolle Zeit verwenden, um Dir zu helfen, dann biste halt an der Adresse falsch.
21.08.2019 15:24 Beiträge des Benutzers | zu Buddylist hinzufügen
Taipi88 Taipi88 ist männlich
myCSharp.de-Mitglied

avatar-3220.jpg


Dabei seit: 02.02.2010
Beiträge: 1.013
Entwicklungsumgebung: VS 2010
Herkunft: Mainz


Taipi88 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hi,

also um ehrlich zu sein - ich hab deinen Code auf SharpLab mal getestet - bei mir kommt bei Eingabe -3.0 auch korrekt -3.5 raus.

Sicher, dass du den aktuellen Build prüfst?

LG
21.08.2019 16:32 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
GyrosMitVielScharf
myCSharp.de-Mitglied

Dabei seit: 08.08.2017
Beiträge: 14

Themenstarter Thema begonnen von GyrosMitVielScharf

GyrosMitVielScharf ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Taipi88,

Th69 wies mich darauf hin, dass die Benutzung in einer Schleife der Art =+ 0.1f grundsätzlich einen Rundungsfehler beinhalten würde.

Genau dies tat ich, allerdings nur zu Testzwecken.

Ich benutze eine ähnliche Routine wie die hier aufgelistete in UNITY, um Objekte zur Laufzeit korrekt zu positionieren beziehungsweise ihre Position zu korrigieren.
Dabei fiel mir auf, dass ein Objekt sich auf z.B. 1.4 und dann auf 2.4 befand, was nicht sein sollte und durfte.

Ich untersuchte diesen Sachverhalt näher und kam zu keiner Lösung.
In meiner Not schrieb ich die oben aufgelistete Routine und nutzte diese in UNITY und stieß auf -3.0 wird zu -2.5 und war daraufhin vollends verwirrt und bat hier um Klärung.

Ich werde mich wohl näher mit dem Umgang von C# mit floats und Runden befassen müssen.
Darauf wäre ich, obwohl naheliegend, so schnell nicht gekommen.
Den Wald vor lauter Bäumen nicht finden...

Danke sehr für deine Hilfe.
21.08.2019 16:54 Beiträge des Benutzers | zu Buddylist hinzufügen
GyrosMitVielScharf
myCSharp.de-Mitglied

Dabei seit: 08.08.2017
Beiträge: 14

Themenstarter Thema begonnen von GyrosMitVielScharf

GyrosMitVielScharf ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top



Zitat:
Wenn Du Dich ordentlich ausdrücken würdest, hätte man auch verstanden, was Du meinst.

Seltsam, Th69 hat sofort verstanden worum es geht und mir einen Lösungsansatz an die Hand gegeben.

Nochmal, bei manchen geht es wohl nicht so schnell, ich schrieb extra hinter Fehler ein Fragezeichen.
Für mich war es in diesem Kontext ein Fehler, da das Resultat nicht wie erwartet ausfiel.
Google Fehler und staune.

Ein logischer Fehler wäre es gewesen, wenn ich in meinem Code etwas "falsch" = unlogisch geschrieben hättte, zum Beispiel - man beachte das "zum Beispiel" und nagle mich nicht darauf/deswegen fest - die Operation mit X ohne das vorherige Abs(x) aufzurufen.
Das wäre ein logischer Fehler gewesen.

Dieser "Fehler" wurde aber, wie ich Dank Th69 nun erfuhr, nicht von mir begangen, sondern liegt an C# und seinem Umgang mit floats.

So weit ich es überblicke, habe ich nicht gepöbelt, wie du es fälschlicherweise auszudrücken beliebtst, sondern mich mokiert.
Nur über dich. Über niemand sonst.
Über deine Nichthilfe und dein aufgeblähtes Gehabe.
Anstatt konkret an die Sache heranzugehen sich erstmal an Marginalitäten abzuarbeiten.

Übrigens und abschließend heißt es bist du und "halt an der falschen Adresse" und nicht "biste halt an der Adresse falsch" und du bist in diesem Thread kein "Helfer, die ich angeblich angepöbelt habe".

Soviel dazu und ich wünsche dir einen schönen Tag.
21.08.2019 16:58 Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 14.025
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von GyrosMitVielScharf:
Dieser "Fehler" wurde aber, wie ich Dank Th69 nun erfuhr, nicht von mir begangen, sondern liegt an C# und seinem Umgang mit floats.

Erster Absatz von  [FAQ] Double und Float: Fehler beim Vergleich und Rundungsfehler

Zitat von https://www.mycsharp.de/wbb2/thread.php?threadid=64462:
Daher ist das Folgende kein spezifisches Problem von C#/.NET, sondern ein Problem des weit verbreiteten Standards bzw. genereller gesprochen der auf Computern zwangsläufig begrenzten Genauigkeit der Zahlendarstellung.

Wenn Dir Leute Hinweise zukommen lassen, dann les es bitte durch.
Danke.

PS: wenn Du meinst weiter zu pöbeln, dann machen wir halt dicht.
Ganz einfach.
21.08.2019 17:02 Beiträge des Benutzers | zu Buddylist hinzufügen
T-Virus T-Virus ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.04.2008
Beiträge: 1.567
Entwicklungsumgebung: Visual Studio, Codeblocks, Edi
Herkunft: Nordhausen, Nörten-Hardenberg


T-Virus ist offline Füge T-Virus Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Wenn du diese Werte als Koordinaten verwenden willst, wäre es dann nicht möglich diese per int abzubilden oder gibt z.B. Unity diese schon so vor?

Gerade wegen Rundungsfehlern, die du dann häufiger haben wirst, würde ich darauf verzichten.
Auch sollte man bei Spielen soweit wie möglich mit Ganzzahlen arbeiten, da die CPU diese schneller verarbeiten kann.
Dürfte zwar auch heute schon nicht mehr so gravierend sein, aber Performance kann man dadurch bei falscher Nutzung schon verlieren.

T-Virus
21.08.2019 17:06 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 14.025
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top



Zitat von T-Virus:
Auch sollte man bei Spielen soweit wie möglich mit Ganzzahlen arbeiten, da die CPU diese schneller verarbeiten kann.

Spiele und Grafiken nutzen i.d.R. float.
Die Genauigkeit von double wird hier i.d.R. nicht benötigt.

Geht hier weniger um die Performance, sondern eher um den Speicherverbrauch bzw. dessen Bandbreite.
Wenn Hardware (CPU) double bereits nativ unterstützt (wie zB x86) und float daher emuliert wird, ist double i.d.R. schneller.
Moderne Hardware hat dann aber SSE die wiederum beide Typen crunched (zB 4xfloat / 2xdouble in einem Zyklus).
21.08.2019 17:07 Beiträge des Benutzers | zu Buddylist hinzufügen
T-Virus T-Virus ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.04.2008
Beiträge: 1.567
Entwicklungsumgebung: Visual Studio, Codeblocks, Edi
Herkunft: Nordhausen, Nörten-Hardenberg


T-Virus ist offline Füge T-Virus Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

@Abt
Dann ist mein Wissen doch schon stark veraltet.
Ist auch ein paar Jahre her, dass ich hier ein paar kleine Spielchen programmiert habe.
Auch dürfte die CPU Leistung heute kaum noch ein Problem damit haben.

T-Virus
21.08.2019 17:10 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
GyrosMitVielScharf
myCSharp.de-Mitglied

Dabei seit: 08.08.2017
Beiträge: 14

Themenstarter Thema begonnen von GyrosMitVielScharf

GyrosMitVielScharf ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

a) Also, bis jetzt pöbelte ich nicht.
b) Ich befolge die Ratschläge von Leuten.
c) Erbsenzählerei, ob nur C#-Fehler oder allgemein einerlei.

d) Leck mich im Arsch und schieb dir diesen Thread in den selbigen.

Erbärmlicher kleiner Wichtigtuer.
MSVP? Wichser. Kleiner. Elendiger. Flachwichser.


mycsharp.de  Moderationshinweis von MrSparkle (21.08.2019 19:37):

Absolut unnötig sowas. Benutzer habe ich gesperrt.
 
21.08.2019 19:25 Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 11 Monate.
Der letzte Beitrag ist älter als 11 Monate.
geschlossen (weitere Infos)


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 12.08.2020 02:42