que - tipos de datos en c++ y su significado
Compara un flotador de 32 bits y un entero de 32 bits sin fundiciĆ³n con el doble, cuando cualquiera de los dos valores sea demasiado grande para ajustarse exactamente al otro tipo (1)
Creo que tu mejor apuesta es ser un poco específico de la plataforma. 2³² se puede representar con precisión en coma flotante. Compruebe si f
es demasiado grande para caber, y luego conviértalo en sin signo y verifique contra m
.
const float unsigned_limit = 4294967296.0f;
bool ok = false;
if (f < unsigned_limit)
{
const auto uf = static_cast<unsigned int>(f);
if (uf <= m)
{
ok = true;
}
}
No me gusta la comparación doble, pero está claro.
Si f
es generalmente significativamente menor que m
(o usualmente significativamente mayor), se puede realizar una prueba contra float(m)*0.99f
(respectivamente float(m)*1.01f
), y luego hacer la comparación exacta en el caso inusual. Probablemente solo valga la pena hacerlo si los perfiles muestran que la ganancia de rendimiento vale la pena la complejidad adicional.
Tengo un número f
coma flotante de 32 bits (se sabe que es positivo) que necesito convertir a un entero sin signo de 32 bits. Su magnitud puede ser demasiado grande para caber. Además, hay un cómputo descendente que requiere cierto margen de maniobra. Puedo calcular el valor máximo aceptable m
como un entero de 32 bits. ¿Cómo puedo determinar de manera eficiente en C ++ 11 en una máquina restringida de 32 bits (ARM M4F) si f <= m
matemáticamente. Tenga en cuenta que los tipos de los dos valores no coinciden. Los siguientes tres enfoques tienen sus problemas:
-
static_cast<uint32_t>(f) <= m
: creo que esto desencadena un comportamiento indefinido sif
no se ajusta al entero de 32 bits -
f <= static_cast<float>(m)
: sim
es demasiado grande para convertirse exactamente, el valor convertido podría ser mayor quem
modo que la comparación posterior producirá el resultado incorrecto en ciertos casos extremos -
static_cast<double>(f) <= static_cast<double>(m)
: es matemáticamente correcto, pero requiere conversión a, y trabajar con double, lo que me gustaría evitar por razones de eficiencia
Seguramente debe haber una forma de convertir un entero en un flotador directamente con la dirección de redondeo especificada, es decir, garantizando que el resultado no exceda la entrada en magnitud. Preferiría una solución estándar de C ++ 11, pero en el peor de los casos, los intrínsecos de la plataforma podrían calificar también.