Hm, gerade aus der DawsonCompare
Routine in Game Programming Gems 6, ist es eine normale Bit-Cast gefolgt von einem Zeichen Flip (da negative Floats Reihenfolge gegenüber dann negative ganze Zahlen). Ich werde mir diese Idee ausleihen.
Sie haben:
// utility
template <typename R, typename T>
R& bit_cast(T& pX)
{
return reinterpret_cast<R&>(pX);
}
// int32_t defined in <boost/cstdint.hpp>.
boost::int32_t float_to_int_bits(float pX)
{
boost::int32_t x = bit_cast<boost::int32_t>(pX);
if (x < 0)
x = 0x80000000 - x;
return x;
}
Wenn Sie Ihre int
32 Bits garantieren können, können Sie nur diese verwenden.
Fun Tatsache: Das Buch geht weiter diese (beachten Sie, nicht mit der genauen Code stelle ich, da ich den Schwimmer-to-int Teil gezupft) zu verwenden, mit Toleranz Gleitkomma-Werte vergleichen:
Dies vergleicht Floats als wahr, wenn ihre Ganzzahldarstellungen innerhalb eines bestimmten Bereichs liegen. (Er verwendet 1000 als einen guten Standard.) Eine zweiglose Version namens LomontCompare
ist mit der gleichen Idee präsentiert, aber Sie müssen das Buch dafür kaufen. :)
Ja, ich glaube, ich habe schon solche Abbildung gesehen - es war ziemlich clever - ich wünschte nur, ich könnte mich erinnern * wo * Ich sah es ... –
Darf ich Ihren Anwendungsfall für solch ein Mapping fragen? –
+1 große Frage –