2012-11-18 66 views
2

我正在使用AR Drone SDK编程无人机。在该文档中,是这样说:负浮点到二进制转换

数-0.8被存储在存储器中作为其值是 BF4CCCCD(16)32位字,根据IEEE-754格式。这32位字可以认为是 保持32位整数值-1085485875(10)。所以 要发送的命令将是AT * PCMD = xx,xx,-1085485875,xx,xx。

它们是如何到达-1085485875二进制转换的十进制表示?它对我没有意义。使用此页:http://kipirvine.com/asm/workbook/floating_tut.htm这页:http://www.madirish.net/240http://cs.furman.edu/digitaldomain/more/ch6/dec_frac_to_bin.htm这个页面,这就是我想出了:

decimal value = -0.8 

binary value of decimal (-0.8) = -.11001100110011001100110 

biased exponent (move above decimal over once to right) = 127 - 1 = 126 = 01111110 

sign, exponent, mantissa (mantissa: drop off the 1 to left of decimal point, pad to 23) = 1 01111110 10011001100110011001100 

10111111010011001100110011001100 = 3209481420 (10) BF4CCCCC (16). 

该文档称,其-1085485875(10)和BF4CCCCD(16)

上午什么我在这里做错了吗?

谢谢。

编辑:

因为我写与节点/ JS的AR无人机的应用程序,如果我使用这些功能的Node.js:

var buffer = new Buffer(4); 
buffer.writeFloatBE(-0.8, 0); 
return -~parseInt(buffer.toString('hex'), 16) - 1; 

我得到正确的结果按文档。当我长时间写出来时,我只是不明白自己做错了什么。我想了解发生了什么事。任何帮助真的很感激。

谢谢。

UPDATE:

所以,我已经想通了(从上面的javascript代码),如果我申请的按位NOT操作者首先为二进制,然后它产生正确的号码。我的问题是,为什么这需要应用?做完这些之后,如果第一位是零而不是一个,你将不得不确定它的否定。这是什么意思?

+0

尝试舍入尾数而不是截断它,并尝试将结果解释为二进制补码数。 – Bovinedragon

+0

@Bovinedragon我不明白当你说我正在截尾数,我在哪里做这个?你能否给我多一点关于将结果解释为二进制补码的信息? .8变成了1100的重复二进制模式,所以我重复它到22个位置,但是因为我从小数点左边移除了1,所以我在最后用另一个0填充它。我在哪里截断它?我只是把符号,指数和尾数放在一起,那最后的结果是正确的?至于这些数字如何存储在内存中? –

+0

我只是不明白他们从哪里得到-1085485875。 –

回答

0

-0.8 = -0.110011001100110011001100 11001100110011001100110011001100110011 ...(空间在位24和25之间 - 位25是舍入位)。这轮到24位为0.110011001100110011001101。下面是它的外观在IEEE单精度格式:

sign biased exponent trailing 23-bits of mantissa 
\/  \/      \/ 
1  01111110   10011001100110011001101 

这是10111111010011001100110011001101,或BF4CCCCD十六进制。如果你认为这是一个二进制补码整数,它是-1085485875。