Normkonforme Methode, Float mit Integral zu vergleichen?

8

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.

    
orlp 27.04.2015, 02:44
quelle

2 Antworten

2
  1. Wenn f außerhalb des Bereichs von I liegt, können Sie das Ergebnis nur anhand seines Vorzeichens angeben.

  2. Wenn f im Bereich von I liegt, aber zu groß, um einen Bruchteil zu haben, vergleichen Sie es als Integer.

  3. 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: Ссылка

    
Potatoswatter 20.06.2015 04:11
quelle
0

So würde ich es machen:

Ich nehme an, dass f endlich ist, die Fälle von unendlich und NaN sind anderswo zu behandeln.

  1. vergleiche f und F (i), wenn nicht gleich, du bist fertig, f und ich sind entweder & lt; oder & gt;

  2. 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 kann     
aka.nice 27.04.2015 16:33
quelle