2

AR Drone SDK を使用してドローンをプログラムしています。ドキュメントでは、次のように述べています。

数値 -0.8 は、IEEE-754 形式に従って、値が BF4CCCCD(16) である 32 ビット ワードとしてメモリに格納されます。この 32 ビット ワードは、32 ビット整数値 -1085485875(10) を保持していると見なすことができます。したがって、送信するコマンドは AT*PCMD=xx,xx,-1085485875,xx,xx になります。

2 進数変換の 10 進数表現で -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;

ドキュメントに従って正しい結果が得られます。長い手で書き出すと、自分が何を間違っているのかわかりません。何が起こっているのか理解したい。どんな助けでも本当に感謝しています。

ありがとう。

アップデート:

したがって、ビット単位の NOT 演算子を最初にバイナリに適用すると、(上記の JavaScript コードから) 正しい数値が生成されることがわかりました。私の質問は、なぜこれを適用する必要があるのですか? これを行った後、最初のビットが 1 ではなく 0 である場合、負かどうかを判断する必要があります。これのポイントは何ですか?

4

1 に答える 1

0

-0.8 = -0.110011001100110011001100 11001100110011001100110011001100110011... (スペースはビット 24 と 25 の間にあります。ビット 25 は丸めビットです)。これは、0.110011001100110011001101 として 24 ビットに丸められます。IEEE 単精度形式では次のようになります。

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

それは 10111111010011001100110011001101、または 16 進数で BF4CCCCD です。これを 2 の補数の整数と見なすと、-1085485875 になります。

于 2012-11-18T04:50:57.960 に答える