Мне нужно преобразовать float в Q31 с фиксированной точкой, значение Q31 означает 1 знаковый бит, 0 бит для целочисленной части и 31 бит для дробной части. Это означает, что Q31 может представлять только числа в диапазоне [-1,0.9999]
.Картирование [-1, + 1] плавает до Q31 фиксированной точки
По определению, при переходе от поплавка к фиксированной точке, умножение на 2ˇN
делается, где N является дробной частью размера, в данном случае 31.
Однако я запуталась с этим кодом, то не работает, но работает:
#define q31_float_to_int(x) ((int) ((float)(x)*(float)0x7FFFFFFF))
И, похоже, все в порядке. Например:
int a = q31_float_to_int(0.5f);
дает Hex: 0x40000000
, что все в порядке.
Почему множитель здесь используется с 2ˇ31 - 1
, а не только 2ˇ31
?
'(с плавающей точкой) 0x7FFFFFFF' является' 2147483648.00000': HTTP: //ideone.com/mawlXx. Даже после кастинга до 'unsigned' значение имеет значение: http://ideone.com/7WMeRE – mch
Хмм? Как получилось 0x7FFFFFFF заканчивается как 2147483648, а не 2147483647 ?? – Danijel
Потому что 2147483647 не может быть представлен как 'float', и поэтому будет найдено ближайшее число, которое равно 2147483648. – mch