MATLAB: преобразование значения uint32 (4 байта) в соответствующую форму с плавающей запятой одинарной точности IEEE

В MATLAB (r2009b) у меня есть переменная uint32, содержащая значение 2147484101.

Это число (его 4 байта) было извлечено из цифровой камеры машинного зрения в процессе захвата. Насколько я понимаю, он содержит форму выдержки камеры с одинарной точностью (должна быть близка к 1/260 с = 3,8 мс).

Как мне преобразовать это 32-битное число в его представление с плавающей запятой одинарной точности IEEE, используя то, что доступно в MATLAB?

С указанным значением в переменной n я попытался использовать комбинацию nn=dec2hex(n,16), а затем hex2num(nn). Но похоже, что hex2num ожидает, что шестнадцатеричное кодирование будет двойной точности, а не одинарной, как здесь. По крайней мере, я получаю странные цифры с помощью этого метода.

Любые идеи?

Изменить: Попробовал ответ @Matt ниже:

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

Который дает:

ans =

  -6.3478820e-043

ans =

  -2.0640313e+003

Я попробовал преобразователь IEEE 754 (апплет JAVA) по адресу http://www.h-schmidt.net/FloatApplet/IEEE754.html.

С использованием:

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

дает

ans =

   c5   01   00   80

ans =

   80   00   01   c5

Ввод этих байтов в апплет (шестнадцатеричный) дает мне те же числа, что и в MATLAB.


person Ole Thomsen Buus    schedule 15.02.2011    source источник


Ответы (2)


Я думаю, вы говорите, что базовые биты представляют число с плавающей запятой, но вы сохранили его как uint32.

Если это так, вы можете преобразовать его (т.е. переинтерпретировать биты) как число с плавающей запятой одинарной точности, используя функцию typecast().

b = typecast(a, 'single')

где а ваша переменная.

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

Отредактировано: не функция приведения, функция приведения типов... Мои извинения!

person Matt    schedule 15.02.2011
comment
Да, это должно быть typecast, а не cast. Но на самом деле я не получаю значений, на которые надеялся. Видите ли, у меня нет предварительных знаний о числах. Я даже не уверен, что правильно их сохранил :) Я просто перепроверил с помощью java-апплета. Так что ваш метод верный. +1 и принято. - person Ole Thomsen Buus; 15.02.2011
comment
@Ole Thomsen Buus: трудно предположить, что вы могли бы сделать по-другому, не зная метода, с помощью которого вы пришли к своему uint32, или спецификации файла / устройства, которое вы читаете. Надеюсь, вы поймете, где что-то не так... - person Matt; 15.02.2011

Вы можете выполнить приведение, когда читаете данные с помощью fread().

Посмотрите на аргумент точности, вы можете прочитать его как число int32 и сохранить его как одно, выполнив

shut_speed=fread(fid,1,'int32=>single');
person mor22    schedule 15.02.2011
comment
Да, это тоже вариант - не подумал об этом. - person Ole Thomsen Buus; 15.02.2011