Hm, recién salido de la rutina DawsonCompare
en Game Programming Gems 6, es un lanzamiento de bits normal seguido de un cambio de signo (ya que los flotantes negativos ordenan los enteros negativos opuestos). Tomaré prestada esa idea.
tiene:
// 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;
}
Si se puede garantizar sus int
es de 32 bits, sólo puede usar eso.
Dato curioso: El libro va a utilizar esto (nota, no con el código exacto presento, ya que me quité la parte de flotación a int) para comparar los valores de punto flotante con la tolerancia:
bool DawsonCompare(float pX, float pY, int pDiff)
{
int x = float_to_int_bits(pX);
int y = float_to_int_bits(pY);
int diff = x - y;
return abs(diff) < pDiff;
}
Esto compara los flotantes como verdaderos si sus representaciones enteras están dentro de un cierto rango. (Utiliza 1000 como un buen valor predeterminado). Una versión sin ramas llamada LomontCompare
se presenta con la misma idea, pero debe comprar el libro para eso. :)
Sí, creo que he visto un mapeo tal ante - Era bastante ingenioso - Solo desearía poder recordar * dónde * Lo vi ... –
¿Puedo preguntar su caso de uso para tal mapeo? –
+1 gran pregunta –