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 » Grundlagen von C# » Warum hat eine Berechnung eine Abweichung von 1 oder sogar 2?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Warum hat eine Berechnung eine Abweichung von 1 oder sogar 2?

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

Dabei seit: 29.04.2020
Beiträge: 64


Rico913 ist offline

Warum hat eine Berechnung eine Abweichung von 1 oder sogar 2?

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

Hi,

ich habe ein Fehler in meiner Berechnung, der mir einige Zeit schon Kopfzerbrechen bereitet.
Zuerstmal der Code:

C#-Code:
float scale_temp = scale * Liste_Messung_Filter_Daten[MovingSegment].Scale_Lst;
int Startpunkt_alt_X = Liste_Messung_Filter_Daten[MovingSegment].Start_Point_X * (int)scale_temp;
int Startpunkt_alt_Y = Liste_Messung_Filter_Daten[MovingSegment].Start_Point_Y * (int)scale_temp;

Die Werte der Variablen lt. Debugger:
Liste_Messung_Filter_Daten[MovingSegment].Scale_Lst = 1.29949236
scale = 0.76953125
scale_temp = 1
Liste_Messung_Filter_Daten[MovingSegment].Start_Point_X = 243
Liste_Messung_Filter_Daten[MovingSegment].Start_Point_Y = 228
Startpunkt_alt_X = 243
Startpunkt_alt_Y = 226

Der Knackpunkt liegt bei Y. Ich habe schon einige Durchgänge durchgespielt - bei X stimmt der Wert (Start_Point_X = Startpunkt_alt_X).
Y hat meistens eine Abweichung von 1. In diesem Beispiel sogar 2.
Ich verstehe es einfach nicht - hat jemand von euch eine Idee?

*Edit*
Liste_Messung_Filter_Daten[MovingSegment].Start_Point_X & ..Y sind als int deklariert.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Rico913 am 14.09.2020 17:08.

14.09.2020 17:04 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
FZelle
myCSharp.de-Poweruser/ Experte

Dabei seit: 23.04.2004
Beiträge: 9.851


FZelle ist offline

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

Immer erst rechnen, dann casten.
14.09.2020 18:04 Beiträge des Benutzers | zu Buddylist hinzufügen
Rico913
myCSharp.de-Mitglied

Dabei seit: 29.04.2020
Beiträge: 64

Themenstarter Thema begonnen von Rico913

Rico913 ist offline

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

Ich habe jetzt mal "Liste_Messung_Filter_Daten[MovingSegment].Start_Point_Y" nach oben genommen und float in double geändert.

C#-Code:
double scale_temp_Y = Liste_Messung_Filter_Daten[MovingSegment].Start_Point_Y * scale * Liste_Messung_Filter_Daten[MovingSegment].Scale_Lst;

Debugger:

C#-Code:
scale_temp_Y = 201.99999586120248 == Liste_Messung_Filter_Daten[MovingSegment].Start_Point_Y * scale * Liste_Messung_Filter_Daten[MovingSegment].Scale_Lst = 202.99999584071338

Das Ergebnis vom Debugger ist also folgendes:

links = rechts
201.99999586120248 = 202.99999584071338

Ich verstehe nicht, wo die 1 herkommt. Ich habe es mit dem Taschenrechner überprüft und rechts stimmt. Mir raucht der Kopf....
14.09.2020 20:46 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Spook Spook ist männlich
myCSharp.de-Mitglied

Dabei seit: 28.10.2008
Beiträge: 220
Entwicklungsumgebung: VS2019
Herkunft: Esslingen a.N.


Spook ist offline

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

Ich rate einfach mal:
MovingSegment ist ein Index einer Schleife. Du inkrementierst diesen und vergleichst dann die Werte aus dem letzten mit denen aus dem aktuellen Durchlauf.
15.09.2020 13:54 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Rico913
myCSharp.de-Mitglied

Dabei seit: 29.04.2020
Beiträge: 64

Themenstarter Thema begonnen von Rico913

Rico913 ist offline

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

Zitat von Spook:
Ich rate einfach mal:
MovingSegment ist ein Index einer Schleife. Du inkrementierst diesen und vergleichst dann die Werte aus dem letzten mit denen aus dem aktuellen Durchlauf.

Fast.
MovingSegment ist der Index einer bestimmten Linie in einem Bild, welche ich verschieben möchte. Das klappt auch alles ohne Probleme.

Nun habe ich ein Zoomfaktor eingeführt. Das heisst in meiner Liste wird der jeweilige Zoomfaktor (Liste_Messung_Filter_Daten[MovingSegment].Scale_Lst) gespeichert. Hinzu kommt der Zoomfaktor des aktuellen Bildausschnittes (scale). Diese beiden Werte multipliziere ich mit einander - beides float.

In meinem Testbeispiel ergibt dies 1.

Um nun in der jeweiligen Zoomstufe zu verschieben, brauche ich den Startpunkt, hochgerechnet auf die aktuelle Zoomstufe. D.h. den alten Startpunkt (Liste_Messung_Filter_Daten[MovingSegment].Start_Point_Y) * scale_temp_Y

Und da kommt nicht das heraus, was ich bei der Multiplikation mit eins erwarten würde.
16.09.2020 07:43 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Spook Spook ist männlich
myCSharp.de-Mitglied

Dabei seit: 28.10.2008
Beiträge: 220
Entwicklungsumgebung: VS2019
Herkunft: Esslingen a.N.


Spook ist offline

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

Zitat:
Liste_Messung_Filter_Daten[MovingSegment].Scale_Lst = 1.29949236
scale = 0.76953125
scale_temp = 1
Liste_Messung_Filter_Daten[MovingSegment].Start_Point_X = 243
Liste_Messung_Filter_Daten[MovingSegment].Start_Point_Y = 228
Startpunkt_alt_X = 243
Startpunkt_alt_Y = 226

Wie hast du diese Werte ermittelt?

Vorschlag:
Trage alle diese Werte beim Debuggen in das "Überwachen" Fenster ein. Halte das Programm hinter der letzten Zuweisung an und mach einen Screenshot von VS in dem man das Überwachen-Fenster, den relevanten Code mit Breakpoint sehen kann.
16.09.2020 08:50 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Th69
myCSharp.de-Poweruser/ Experte

avatar-2578.jpg


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


Th69 ist offline

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

Verwendest du Threads (bzw. Background-Tasks) in deinem Programm (welche die Liste oder den Index verändert)?

Ansonsten kann es gar nicht bei einer Ganzzahlmultiplikation von 228 * 1 zu 226 kommen.
16.09.2020 09:45 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Rico913
myCSharp.de-Mitglied

Dabei seit: 29.04.2020
Beiträge: 64

Themenstarter Thema begonnen von Rico913

Rico913 ist offline

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

Leider habe ich bei den Listen-Werten eine Fehlermeldung bekommen.
Ich habe diese in einer extra Klasse definiert:

C#-Code:
public class Liste_Messung_Filter
{
    public int Image_ID_Lst { get; set; }
    public int Messlinie_ID_Lst { get; set; }
    public double Laenge_Lst { get; set; }
    public int Start_Point_X { get; set; }
    public int Start_Point_Y { get; set; }
    public int End_Point_X { get; set; }
    public int End_Point_Y { get; set; }
    public float Scale_Lst { get; set; }
}

Der Variablen der Listenwerte haben folgende Werte:
Liste_Messung_Filter_Daten[MovingSegment].Start_Point_X = 153
Liste_Messung_Filter_Daten[MovingSegment].Start_Point_Y = 235

Um sie auszulesen habe ich sie in eine extra-Variable schreiben lassen:

C#-Code:
int Liste_Messung_Filter_Daten_MovingSegment_Start_Point_X_temp =  Liste_Messung_Filter_Daten[MovingSegment].Start_Point_X;
int Liste_Messung_Filter_Daten_MovingSegment_Start_Point_Y_temp =  Liste_Messung_Filter_Daten[MovingSegment].Start_Point_Y;

Und dort passiert bei Y etwas Merkwürdiges:
Ergebnis: 236 = 235 verwundert

Rico913 hat dieses Bild (verkleinerte Version) angehängt:
Unbenannt.jpg
Volle Bildgröße

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Rico913 am 16.09.2020 10:18.

16.09.2020 09:48 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Th69
myCSharp.de-Poweruser/ Experte

avatar-2578.jpg


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


Th69 ist offline

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

Das Bild sagt aber etwas anderes: 236 == 236.

Hast du dir MovingSegment mal ausgeben lassen? Du kannst dir auch die Inhalte der Liste Liste_Messung_Filter_Daten im Überwachungsfenster anzeigen lassen (oder du benutzt gleich das "Locals"-Fenster).

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Th69 am 16.09.2020 10:09.

16.09.2020 10:05 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Rico913
myCSharp.de-Mitglied

Dabei seit: 29.04.2020
Beiträge: 64

Themenstarter Thema begonnen von Rico913

Rico913 ist offline

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

ohh .. ich hatte ein Copy&Paste-Feher drin:

Der Variablen der Listenwerte haben folgende Werte:
Liste_Messung_Filter_Daten[MovingSegment].Start_Point_X = 153
Liste_Messung_Filter_Daten[MovingSegment].Start_Point_Y = 235


Eben nicht gleich:

C#-Code:
int Liste_Messung_Filter_Daten_MovingSegment_Start_Point_Y_temp =  Liste_Messung_Filter_Daten[MovingSegment].Start_Point_Y;

236 = 235

MovingSegment hat den Richtigen und bei allen den gleichen Wert, bspw. hier 0
16.09.2020 10:17 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Spook Spook ist männlich
myCSharp.de-Mitglied

Dabei seit: 28.10.2008
Beiträge: 220
Entwicklungsumgebung: VS2019
Herkunft: Esslingen a.N.


Spook ist offline

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

Leider kann man in dem Screenshot nicht sehen, was um die Zuweisungen, die du ja nun schon mehrmals gepostet hast, passiert. Poste bitte die _komplette_ Schleife, inklusive der Anzeige, wo das Programm sich gerade befindet (gelber Pfeil links). Und am noch den (wenn nötig gekürzten) Inhalt von Liste_Messung_Filter_Daten.

Spook hat dieses Bild (verkleinerte Version) angehängt:
Pfeil.png
Volle Bildgröße

16.09.2020 10:33 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 27.09.2020 16:37