2017-08-25 5 views
0

In meinem Programm lege ich bestimmte Koordinaten in eine Liste. Der Algorithmus fügt jedoch manchmal zweimal die gleichen Koordinaten in die Liste ein. Um das zu vermeiden, muss ich den Standardansatz durch den EPSILON Wert auf die absolute Differenz der beiden x- und y-Werte aus allen Positionen in der Liste Vergleich:Kleinste EPSILON zum Vergleich von Doppelvariablen in C?

bool doubleEqual(double x1, double y1, double x2, double y2){ 
    if((fabs(x1-x2) < EPSILON) && (fabs(y1-y2) < EPSILON)){ 
     return TRUE; // particle is already in list 
    } 
    return FALSE; // particle is not in the list 
} 

Ich habe mehrere Fragen:

1) Ist diese Implementierung zum Vergleich der Position von zwei Partikeln sogar korrekt?

2) Wie klein kann ich EPSILON wählen? (Die Partikel können sehr nahe beieinander liegen)

3) Gibt es eine schnellere/robustere Implementierung, um die Position von Partikeln zu vergleichen?

+0

Wenn Sie etwas in einer Liste basierend auf der genauen Position platzieren, verwenden Sie ein Integer-Konzept.Das ist im Grunde, was Sie mit den Epsilonen machen - schneiden Sie extra Präzision weg, um den doppelten Vergleich in einen ganzzahligen Vergleich zu verwandeln. Wenn Sie eine Überlappung sehen möchten, nehme ich an, dass sie eine begrenzende Geometrie haben. Überprüfen Sie, ob es eine Kollision gibt. –

+0

'x1' und' x2' können '1e + 300' oder' 1e-300' sein. Was ist ihr Unterschied? –

+1

'fabs (x1-x2) chux

Antwort

2

Der Algorithmus fügt jedoch manchmal zweimal die gleichen Koordinaten in die Liste ein. Um das zu vermeiden ...

ja, ich meine die gleichen Koordinaten (gleiche Partikel = gleiche Position). Nicht nur zwei Doppelvariablen, die sehr nahe beieinander liegen.

Um zu vermeiden, Elemente XY, die die gleichen, ein einfaches sind vergleichen ausreichend ist

bool doubleEqual(double x1, double y1, double x2, double y2){ 
    return (x1 == x2) && (y1 == y2); 
} 

1) Ist diese Umsetzung die Position zweier Teilchen auch richtig zu vergleichen?

Die Verwendung einer festen Differenz (Epsilon) ist nur über einen engen Bereich von FP-Werten sinnvoll. 1e100 und 2e100 unterscheiden sich in ähnlicher Weise von 1e-100 und 2e-100 von einem Fließpunkt Gesichtspunkt.

2) Wie klein kann ich EPSILON wählen? (Die Partikel können kommen wirklich nahe beieinander)

same-ness zu vergleichen, verwenden ==

3) Gibt es eine schnellere/oder robustere Ausführung die Position von Partikeln zu vergleichen?

einfach ==


-Code verwenden können, mit == Doppel vergleichen, das ist sehr nützlich Gleichheit für den Vergleich, nicht Nähe. Wenn nur die Gleichheitsverhinderung erforderlich ist, ist if (x1 == x2 && y1 == y2) ausreichend.

Das tiefere Problem ist, warum "das gleiche Koordinaten in die Liste zweimal" ein Problem? IMO, diese Einschränkung ist das Problem. Verwenden Sie einen Algorithmus, für den diese Einschränkung nicht erforderlich ist.