Viniendo a esta tarde, pero pensé en otro enfoque.
Si sabe que su sistema utiliza el formato de coma flotante IEEE754, pero no la magnitud de los tipos de punto flotante son en relación con los tipos enteros, usted podría hacer algo como esto:
bool isFloatIEEE754Negative(float f)
{
float d = f;
if (sizeof(float)==sizeof(unsigned short int)) {
return (*(unsigned short int *)(&d) >> (sizeof(unsigned short int)*CHAR_BIT - 1) == 1);
}
else if (sizeof(float)==sizeof(unsigned int)) {
return (*(unsigned int *)(&d) >> (sizeof(unsigned int)*CHAR_BIT - 1) == 1);
}
else if (sizeof(float)==sizeof(unsigned long)) {
return (*(unsigned long *)(&d) >> (sizeof(unsigned long)*CHAR_BIT - 1) == 1);
}
else if (sizeof(float)==sizeof(unsigned char)) {
return (*(unsigned char *)(&d) >> (sizeof(unsigned char)*CHAR_BIT - 1) == 1);
}
else if (sizeof(float)==sizeof(unsigned long long)) {
return (*(unsigned long long *)(&d) >> (sizeof(unsigned long long)*CHAR_BIT - 1) == 1);
}
return false; // Should never get here if you've covered all the potential types!
}
En esencia, se tratan los bytes en su flotante como un tipo entero sin signo, luego a la derecha, todos los bits menos uno (el bit de signo) a la derecha desaparecen. '>>' funciona independientemente de endianidad por lo que esto pasa por alto ese problema.
Si es posible determinar pre-ejecución que no firmada tipo entero es la misma longitud que el Tipo de punto flotante, se puede abreviar esto:
#define FLOAT_EQUIV_AS_UINT unsigned int // or whatever it is
bool isFloatIEEE754Negative(float f)
{
float d = f;
return (*(FLOAT_EQUIV_AS_UINT *)(&d) >> (sizeof(FLOAT_EQUIV_AS_UINT)*CHAR_BIT - 1) == 1);
}
Esto funcionó en mis sistemas de prueba; ¿Alguien ve alguna advertencia o pasa por alto 'gotchas'?
Hasta que sepamos en qué sistema se encuentra, ¿cómo podemos corregir su suposición acerca de si su máquina es grande o poco endian? – jball
mis suposiciones fueron generalizadas, lo siento si eso no estaba claro. – Rarge
¿Qué pasa con <0? Sé que incluso el punto flotante 0 puede tener un signo, pero el operador
hhafez