Nehmen wir an, ich habe zwei Objekte i
und f
der jeweiligen Typen I
und F
. Ich weiß, dass std::is_integral<I>::value
wahr ist und std::is_floating_point<F>::value
wahr ist.
Gibt es einen vollständig standardkonformen Weg, um herauszufinden, ob der Wert von i
kleiner ist als der Wert von f
? Beachten Sie die Betonung auf "vollständig standardkonform", für diese Frage interessieren mich nur Antworten, die durch Garantien aus dem C ++ - Standard abgesichert sind.
Die triviale Implementierung i < I(f)
funktioniert nicht, weil der Wert von f
möglicherweise nicht in i
passt. Die triviale Implementierung F(i) < f
funktioniert auch nicht, weil die Genauigkeit von f
möglicherweise nicht ausreicht, um i
darzustellen, wodurch i
auf einen Wert gleich f
gerundet wird (wenn Sie IEEE754-Gleitkommazahlen haben) , 16777219 < 16777220.f
schlägt fehl).
Aber hier kommt das wahre Dilemma: Wenn Sie std::numeric_limits::max
verwenden wollen, um diese Probleme zu lindern, kehren Sie zu dem ursprünglichen Problem zurück, Floats und Ganzzahlen zu vergleichen! Dies liegt daran, dass der Typ von std::numeric_limits::max
dem ursprünglichen Typ entspricht.
Wenn f
außerhalb des Bereichs von I
liegt, können Sie das Ergebnis nur anhand seines Vorzeichens angeben.
Wenn f
im Bereich von I
liegt, aber zu groß, um einen Bruchteil zu haben, vergleichen Sie es als Integer.
Andernfalls ist es sicher, i
auf F
zu setzen, da die Rundung das Ergebnis des Vergleichs nicht ändert: f
ist bereits kleiner als jeder Wert von I
, der gerundet werden würde.
.
%Vor%Demo: Ссылка
So würde ich es machen:
Ich nehme an, dass f endlich ist, die Fälle von unendlich und NaN sind anderswo zu behandeln.
vergleiche f und F (i), wenn nicht gleich, du bist fertig, f und ich sind entweder & lt; oder & gt;
wenn gleich, dann vergleiche ich (f) und i
Die einzigen Annahmen sind:
Wenn ein float genau den Wert i hat, gibt F (i) diesen Wert
Wenn es eine Ganzzahl gibt, die genau denselben Wert wie f hat, dann gibt I (f) diesen Wert an
Monotonie der Funktionen F und I
BEARBEITEN
Um genauer zu sein, sind obige Tricks zum Schreiben einer Vergleichsfunktion, nicht nur zum Testen der Gleichheit ...
%Vor%Es steht Ihnen frei, diesen Entwurf in einen C ++ - Code umzuwandeln, der mehrere verschiedene floatType / intType
verarbeiten kannTags und Links c++ comparison language-lawyer integer floating-point