En MATLAB (r2009b) tengo un uint32 variable que contiene el valor 2147484101.

Este número (4 bytes) ha sido extraído de una máquina digital-cámara de la visión en un proceso de copia. De acuerdo a lo que entiendo que se mantiene la precisión simple forma de la velocidad de obturación de la cámara (debe ser cercano a 1/260s = 3.8 ms).

¿Cómo puedo convertir este número de 32 bits para su solo de IEEE de punto flotante de precisión de la representación – el uso de lo que está disponible en MATLAB?

Con el mencionado valor en la variable n, he intentado usar una combinación de nn=dec2hex(n,16) y, a continuación, hex2num(nn). Pero parece que hex2num espera que la codificación hexadecimal a ser de doble precisión y no solo como lo es aquí. Al menos estoy consiguiendo extraño números con este método.

Alguna idea?

Edición: Intentado @Matt respuesta a continuación:

typecast(uint32(2147484101),'single') %# without swapbytes
typecast(swapbytes(uint32(2147484101)),'single') %# with swapbytes

Que da:

ans =

  -6.3478820e-043

ans =

  -2.0640313e+003

He probado el IEEE 754 convertidor (applet de JAVA) en http://www.h-schmidt.net/FloatApplet/IEEE754.html.

Uso:

format hex
typecast(uint32(2147484101),'uint8') %# without swapbytes
typecast(swapbytes(uint32(2147484101)),'uint8') %# with swapbytes

da

ans =

   c5   01   00   80

ans =

   80   00   01   c5

La introducción de estos bytes en el applet (hexadecimal) me da los mismos números que en MATLAB.

2 Comentarios

  1. 8

    Creo que lo que estás diciendo es que el subyacente de bits que representan un número de punto flotante, pero que lo tienes almacenado como un uint32.

    Si es ese caso, se puede realizar la conversión (es decir, reinterpretar los bits) como una sola precisión float mediante el encasillado() función.

    b = typecast(a, 'single')

    donde a es la variable.

    Ver:
    http://www.mathworks.com/help/techdoc/ref/typecast.html

    Editado: no la función de conversión, la conversión de tipo de función… Mis disculpas!

    • Sí, debe ser typecast y no cast. Pero no estoy realmente en los valores que yo esperaba. Usted ve, yo no tengo ningún previa de conocimientos acerca de los números. Ni siquiera estoy seguro de que tiene almacenados correctamente 🙂 acabo de volver a comprobar el uso de un applet de java. Por lo que su método es el sonido. +1 y aceptado.
    • Thomsen Buus: Es difícil sugerir lo que podría hacer de manera diferente sin saber el método por el cual llegó a su uint32, o la especificación del archivo/dispositivo que usted está leyendo. Ojala que averiguar a dónde va mal…
  2. 2

    Usted podría hacer el reparto cuando usted lee los datos con fread().

    Echar un vistazo por la precisión argumento, se podría leer como el int32 número y guardarlo como un solo haciendo

    shut_speed=fread(fid,1,'int32=>single');
    • Sí, también es una posibilidad – no había pensado en eso.

Dejar respuesta

Please enter your comment!
Please enter your name here