MATLAB:将一个uint32(4字节)值转换为相应的IEEE单精度浮点形式

4
在MATLAB (r2009b)中,我有一个包含值2147484101的uint32变量。 这个数字(它的4个字节)是从一台数字机器视觉相机中提取的,在抓取过程中产生。 据我所知,它保存着相机快门速度的单精度形式(应该接近1/260秒=3.8毫秒)。 如何将这个32位数转换为其IEEE单精度浮点表示——使用MATLAB中可用的内容? 使用变量n中提到的值,我尝试使用nn=dec2hex(n,16)的组合,然后是。但似乎hex2num期望十六进制编码是双精度而不是这里的单精度。至少用这种方法我得到了奇怪的数字。 有什么想法吗? 编辑:尝试了下面@Matt的答案:
typecast(uint32(2147484101),'single') %# without swapbytes
typecast(swapbytes(uint32(2147484101)),'single') %# with swapbytes

这将会得到:

ans =

  -6.3478820e-043

ans =

  -2.0640313e+003

我尝试了位于http://www.h-schmidt.net/FloatApplet/IEEE754.html的IEEE 754转换器(JAVA小程序)。
使用方法如下:
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 相同的数字。

2个回答

8
我认为你的意思是底层二进制位表示一个浮点数,但你将其存储为uint32。
如果是这样的话,你可以使用typecast()函数将其强制转换(即重新解释位)为单精度浮点数。
b = typecast(a, 'single')

其中a是您的变量。

请参见: http://www.mathworks.com/help/techdoc/ref/typecast.html

编辑:不是cast函数,而是typecast函数...我很抱歉!


是的,必须使用“typecast”而不是“cast”。但我并没有得到我希望得到的值。你知道,我对这些数字没有先前的了解。我甚至不确定它们是否被正确存储 :) 我只是使用Java小程序进行了交叉检查。所以你的方法是可靠的。+1并接受。 - Ole Thomsen Buus
@Ole Thomsen Buus:不知道你是通过什么方法得到你的uint32,或者你正在读取的文件/设备的规格,所以很难建议你应该做些什么不同的事情。希望你能找出问题出在哪里... - Matt

2

在使用fread()读取数据时,您可以进行转换。

查找精度参数,您可以将其读取为int32数字,并通过以下方式存储为单个值

shut_speed=fread(fid,1,'int32=>single');

是的,那也是一种可能性 - 我没有想到过。 - Ole Thomsen Buus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接