Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Warum hat eine Berechnung eine Abweichung von 1 oder sogar 2?
Rico913
myCSharp.de - Member



Dabei seit:
Beiträge: 85

Themenstarter:

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

beantworten | zitieren | melden

Hi,

ich habe ein Fehler in meiner Berechnung, der mir einige Zeit schon Kopfzerbrechen bereitet.
Zuerstmal der 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 .
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 10064

beantworten | zitieren | melden

Immer erst rechnen, dann casten.
private Nachricht | Beiträge des Benutzers
Rico913
myCSharp.de - Member



Dabei seit:
Beiträge: 85

Themenstarter:

beantworten | zitieren | melden

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


double scale_temp_Y = Liste_Messung_Filter_Daten[MovingSegment].Start_Point_Y * scale * Liste_Messung_Filter_Daten[MovingSegment].Scale_Lst;

Debugger:


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....
private Nachricht | Beiträge des Benutzers
Spook
myCSharp.de - Member



Dabei seit:
Beiträge: 233
Herkunft: Esslingen a.N.

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Rico913
myCSharp.de - Member



Dabei seit:
Beiträge: 85

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Spook
myCSharp.de - Member



Dabei seit:
Beiträge: 233
Herkunft: Esslingen a.N.

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 3977

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Rico913
myCSharp.de - Member



Dabei seit:
Beiträge: 85

Themenstarter:

beantworten | zitieren | melden

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


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:


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
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Rico913 am .
Attachments
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 3977

beantworten | zitieren | melden

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 .
private Nachricht | Beiträge des Benutzers
Rico913
myCSharp.de - Member



Dabei seit:
Beiträge: 85

Themenstarter:

beantworten | zitieren | melden

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:


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
private Nachricht | Beiträge des Benutzers
Spook
myCSharp.de - Member



Dabei seit:
Beiträge: 233
Herkunft: Esslingen a.N.

beantworten | zitieren | melden

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.
Attachments
private Nachricht | Beiträge des Benutzers