Laden...

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

Erstellt von Rico913 vor 3 Jahren Letzter Beitrag vor 3 Jahren 876 Views
R
Rico913 Themenstarter:in
95 Beiträge seit 2020
vor 3 Jahren
Warum hat eine Berechnung eine Abweichung von 1 oder sogar 2?

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.

F
10.010 Beiträge seit 2004
vor 3 Jahren

Immer erst rechnen, dann casten.

R
Rico913 Themenstarter:in
95 Beiträge seit 2020
vor 3 Jahren

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....

S
248 Beiträge seit 2008
vor 3 Jahren

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.

R
Rico913 Themenstarter:in
95 Beiträge seit 2020
vor 3 Jahren

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.

S
248 Beiträge seit 2008
vor 3 Jahren

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.

4.931 Beiträge seit 2008
vor 3 Jahren

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.

R
Rico913 Themenstarter:in
95 Beiträge seit 2020
vor 3 Jahren

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 🤔

4.931 Beiträge seit 2008
vor 3 Jahren

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).

R
Rico913 Themenstarter:in
95 Beiträge seit 2020
vor 3 Jahren

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

S
248 Beiträge seit 2008
vor 3 Jahren

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.