Выполнение модификации Бита для чисел с плавающей точкой в ​​Matlab - PullRequest
5 голосов
/ 09 марта 2011

Я работаю в Matlab, используя факторизацию неотрицательной матрицы, чтобы разложить матрицу на два фактора.Используя это, я получаю две матрицы с плавающей запятой двойной точности, B и C.

Результаты выборки равны

B(1,1) = 0.118
C(1,1) = 112.035

.Функция при любом значении я получаю ошибку, потому что битовый набор требует целых чисел без знака.

Я также пытался использовать функцию dec2bin, которая, как я предполагал, конвертирует десятичные числа в двоичные, но возвращает B для 1,1 (B).

Кто-нибудь знает какой-либо способ борьбы с плавающими на битовом уровне без потери точности?

Ответы [ 2 ]

6 голосов
/ 09 марта 2011

Вы должны изучить функции typecast и bitset.(Док здесь и здесь соответственно).Это позволяет вам делать такие вещи, как

xb = typecast( 1.0, 'uint64' );
xb = bitset( xb, 10, 1 );
typecast( xb, 'double' );
0 голосов
/ 09 марта 2011

Функции num2hex и hex2num - ваши друзья. (Хотя это не обязательно очень хорошие друзья; шестнадцатеричные строки - не лучшая вообразимая форма для работы с двоичными числами с плавающей запятой. Вы можете разделить их, скажем, на 8-кратные куски и преобразовать каждый в целое число.)

Из документов MATLAB:

num2hex([1 0 0.1 -pi Inf NaN])

возвращает

ans =

3ff0000000000000
0000000000000000
3fb999999999999a
c00921fb54442d18
7ff0000000000000
fff8000000000000

и

num2hex(single([1 0 0.1 -pi Inf NaN]))

1012 * возвращается *

ans =

3f800000
00000000
3dcccccd
c0490fdb
7f800000
ffc00000
...