Pregunta

Estoy trabajando en Hadoop, y tengo que proporcionar un comparador para ordenar objetos como red prima para las matrices de bytes. Esto es fácil para que haga con números enteros - acabo de comparar cada byte de orden. También tengo que hacer esto por flotadores. Creo, pero no puedo encontrar una referencia, que el formato IEEE 754 para los flotadores utilizados por Java se puede ordenar por simplemente comparando cada byte como un valor con signo de 8 bits.

Alguien puede confirmar o refutar esto?

Edit: es la representación de punto flotante IEEE 754 de 32 bits. De hecho, tengo una (mayor) Tampón de bytes y una longitud y desplazamiento dentro de ese búfer. He encontrado algunos métodos de utilidad ya allí que hacen que sea fácil de convertir esto en un flotador, así que supongo que esta cuestión es discutible. Todavía estoy ansioso por ver si alguien sabe la respuesta.

¿Fue útil?

Solución

flotadores

positivas tienen el mismo orden como sus representaciones bits vistos como 2s enteros del complemento. flotadores negativos no lo hacen.

Por ejemplo, la representación de bits de -2.0f es 0xc0000000 y -1.0f es 0xbf800000. Si intenta utilizar una comparación de las representaciones, se obtiene -2.0f> -1.0f, lo cual es incorrecto.

También está el tema de la NaNs (que compara desordenada contra todos los datos de punto flotante, mientras que las representaciones no lo hacen), pero no puede cuidar de ellos.

Otros consejos

Esto casi funciona:

int bits = Float.floatToIntBits(x);
bits ^= (bits >> 31) & Integer.MAX_VALUE;

Aquí flotadores negativos tienen los bits 0-30 invertida (porque desea que el orden opuesto a lo que la representación original de signo / magnitud le daría, al tiempo que preserva el bit de signo.)

Advertencias:

  • NaNs están incluidos en el pedido (mejor considerar los resultados indefinido si están involucrados NaNs.)
  • 0 compara ahora como mayor de -0 (el incorporado en los operadores relacionales consideran iguales.)

Funciona para todos los demás valores, sin embargo, incluyendo denormals y infinitos.

Use Float.toIntBits (float) y comparar los números enteros.

Editar Esto sólo funciona para los números positivos, entre ellos el infinito positivo, pero no NaN. Para los números negativos que tiene que invertir el orden. Y los números positivos son de mayor curso de números negativos.

bien, si está transmitiendo datos a través de la red, debe tener alguna forma de representación semántica para cuando esté transmitiendo un int y cuando esté transmitiendo un flotador. Puesto que es la máquina la información agnóstico, tipo de datos anchura se definirá también en algún lugar o predefinida por la especificación (es decir, 32 bits o 64 bits flotadores). Por lo tanto, lo que realmente debe hacer es acumulan sus bytes en el tipo de datos adecuado, a continuación, utilizar los tipos de datos de lenguaje natural para hacer la comparación.

Para ser realmente precisa con una respuesta Tho, tendríamos que ver el código de transmisión y recepción para ver si está autoboxing primitivas a través de algún tipo de decoración i / o corriente de agua o algo por el estilo. Para una mejor respuesta, por favor obtener mejores detalles.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top