2017-01-14 2 views
0

Ich habe eine Klasse, Vektor, der von einem "rohen Vektor" geerbtWarum True-Anweisung falsch?

struct vector2raw { 
    real_t x, y; 
}; 
struct vector2 : public vector2raw { 
    vector2() { null(); } 
    vector2(real_t x, real_t y) { this->x = x; this->y = y; } 
    vector2(const vector2 &v) { x = v.x; y = v.y; } 
and so on 

Jetzt möchte ich zwei Zahlen vergleichen, ein vy = 4 von v = (5,41, 4), eine weitere min.y = 4 von min = (4,4). Das ist nur der seltsame Fall, wenn ich zwei gleiche Zahlen vergleiche, andere Fälle werden korrekt ausgeführt. Ich bekomme immer falsch (4> = 4) (v.y> = min.y). Was kann das Problem sein?

real_t definiert UPD zu verdoppeln: Das in C++

+0

die Sprachenprogrammierung Erwähnen – JJJ

+0

@JJJ helfen würde, C++ languge –

+0

try debug mit setprecision wie in: http://stackoverflow.com/a/6722297/2266462 – vovkasm

Antwort

1

Anscheinend geschrieben (Sie nicht ein reproduzierbares Beispiel zu geben) Sie vergleichen Gleitkommazahlen mit ==.

Das ist eine nicht gute Idee, es sei denn, diese Zahlen sind integrale Werte, und für Anfänger ist es eine allgemein schlechte Idee.

Zwei Gleitkommawerte können gleich erscheinen, z. Sie geben dieselbe Darstellung, wenn Sie keine zusätzlichen Dezimalstellen angeben, während sie sich in Wirklichkeit in einer ansonsten sehr unbedeutenden Zahl unterscheiden.

In den alten Tagen wurden Anfänger, die auf dieses Problem stießen, auf “ verwiesen. Was jeder Wissenschaftler über Gleitkommazahlen wissen sollte (oder etwa Titel aus fehlbarem Speicher).

In den letzten Jahren wurde ich dafür kritisiert, dass ich diese Referenz gebe, weil echtes technisches Zeug und so weiter, angeblich, für die heutigen Studenten zu schwer ist. Und die Leute haben einfachere Alternativen vorgeschlagen, ähnlich wie die einfache Version von Wikipedia. Ich kann mich jedoch an keine von ihnen erinnern.