C ++ hat std::nextafter()
, was den nächsten darstellbaren Wert nach einem gegebenen Gleitkommawert f zurückgibt . In meinem Fall möchte ich n Bits Slop in den unteren Mantissenbits zulassen , sodass für 3 Bits Slop der 8. nächste Wert nach einem bestimmten Wert f erforderlich wäre . Ich könnte nextafter()
acht Mal anrufen , aber gibt es eine bessere Möglichkeit, damit umzugehen?
Bei den meisten Werten können Sie mit dem Umwandeln des FP-Werts in uint_64
, dem Hinzufügen der Toleranz ( 1<<3
für 3 Bit Slop) und dem anschließenden Umwandeln double
dank des Layouts von IEEE 754 auskommen. Dies basiert jedoch auf dem Gleitkomma von IEEE 754 ( eine gute Annahme, aber auch nicht ganz solide).
(Als Hintergrund möchte ich dies verwenden, um Schnittpunkte der Strahloberfläche zu heben, die sich aufgrund von FP-Ungenauigkeiten gelegentlich innerhalb der Oberfläche befinden. Diejenigen, die mit robustem Gleitkomma vertraut sind, werden verstehen, warum dies epsilon
eine schreckliche Lösung ist.)
std::numeric_limits<T>::is_iec559
, um zu überprüfen, ob IEEE 754 verwendet wird, und die Funktion entsprechend zu spezialisieren.