【问题标题】:Negative floating point to binary conversion负浮点到二进制转换
【发布时间】:2012-11-18 01:03:27
【问题描述】:

我正在使用 AR Drone SDK 对无人机进行编程。在文档中,是这样说的:

数字 -0.8 作为 32 位字存储在内存中,其值为 BF4CCCCD(16),根据 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/240 和这个页面http://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)

我在这里做错了什么???

谢谢。

编辑:

由于我正在使用 node/js 编写 AR DRONE 应用程序,如果我使用这些 node.js 函数:

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

根据文档,我得到了正确的结果。当我把它写出来时,我只是不明白我做错了什么。我想了解发生了什么。非常感谢任何帮助。

谢谢。

更新:

所以,我已经知道(从上面的 javascript 代码)如果我先将按位 NOT 运算符应用于二进制,它就会产生正确的数字。我的问题是,为什么需要应用这个?完成此操作后,如果第一位是零而不是一,则必须确定其是否为负。这有什么意义?

【问题讨论】:

  • 尝试舍入尾数而不是截断尾数,并尝试将结果解释为二进制补码。
  • @Bovinedragon 当你说我要截断尾数时我不明白,我在哪里做这个?你能给我更多关于将结果解释为二进制补码的信息吗? .8 变成了 1100 的重复二进制模式,所以我将它重复到 22 位,但是由于我从小数点左边删除了 1,然后我在最后用另一个 0 填充它。我在哪里截断它?我只是把符号、指数和尾数放在一起,最后的结果对吗?至于这些数字是如何存储在内存中的,对吗?
  • 我只是不明白他们从哪里得到 -1085485875。
  • 二进制补码是计算机通常用来存储整数的二进制格式。您可能可以在网上找到一些资源,这些资源可以比我更好地解释它是如何工作的。通过查看数字的按位,您走在正确的轨道上。
  • 四舍五入,你得到的尾数后面的几位数字是1100,所以尾数应该四舍五入到10011001100110011001101。

标签: floating-point binary hex base-conversion ar.drone


【解决方案1】:

-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。

【讨论】:

    猜你喜欢
    • 2017-01-05
    • 2021-09-10
    • 2015-01-25
    • 2015-06-01
    • 2015-10-11
    • 2018-10-17
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    相关资源
    最近更新 更多