Отрицательное преобразование с плавающей запятой в двоичное

Я использую 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)

Что я здесь делаю не так???

Спасибо.

Редактировать:

Поскольку я пишу приложение AR DRONE с помощью node/js, если я использую эти функции node.js:

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

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

Спасибо.

ОБНОВИТЬ:

Итак, я понял (из приведенного выше кода javascript), что если я сначала применю побитовый оператор НЕ к двоичному коду, он затем выдаст правильное число. У меня вопрос, зачем это нужно применять? После этого вам нужно будет определить, является ли он отрицательным, если первый бит равен нулю, а не единице. Какой в ​​этом смысл?


person Ian Herbert    schedule 18.11.2012    source источник
comment
Попробуйте округлить мантиссу, а не просто обрезать ее, а также попробуйте интерпретировать результат как число в дополнении до двух.   -  person Bovinedragon    schedule 18.11.2012
comment
@Bovinedragon Я не понимаю, когда вы говорите, что я усекаю мантиссу, где я это делаю? Не могли бы вы дать мне немного больше информации об интерпретации результата как числа в дополнении до двух? .8 становится повторяющимся двоичным шаблоном 1100, поэтому я повторяю его до 22 знаков, но затем, поскольку я удаляю 1 слева от десятичного числа, я дополняю его еще одним 0 в конце. Где я усекаю это хотя? Я просто беру знак, показатель степени и мантиссу вместе, это правильный конечный результат? насколько эти числа хранятся в памяти правильно?   -  person Ian Herbert    schedule 18.11.2012
comment
Я просто не понимаю, откуда они берут -1085485875 из всего этого.   -  person Ian Herbert    schedule 18.11.2012
comment
Дополнение до двух — это двоичный формат, который обычно используется компьютерами для хранения целых чисел. Вы, вероятно, можете найти некоторые ресурсы в Интернете, которые могут объяснить, как это работает лучше, чем я. Вы на правильном пути, если смотрите на побитовое не число.   -  person Bovinedragon    schedule 18.11.2012
comment
Что касается округления, следующие несколько цифр после полученной мантиссы будут 1100, поэтому мантисса должна быть округлена до 10011001100110011001101.   -  person Bovinedragon    schedule 18.11.2012


Ответы (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.

person Rick Regan    schedule 18.11.2012