Эффективный способ получить бит в двоичном разложении [0,1] вещественного в Mathematica?

Как известно, любое вещественное в [0,1] можно записать как двоичное расширение в базе 1/2:

x = b1 * 1/2^1 + b2 * 1/2^2 + ...

Я хотел бы получить эффективный способ получить bi для заданного x и index i, и я не думаю, что в Mathematica есть какой-либо встроенный способ сделать это. IntegerDigits и RealDigits, кажется, не в состоянии помочь, и ни одна из связанных функций не уместна.

Очевидное решение состоит в том, чтобы сделать ручное преобразование, но я надеялся избежать этого. Я что-то пропустил?

РЕДАКТИРОВАТЬ: для дальнейшего использования, то, что я искал, может быть сделано таким образом,

BinaryExpansionBit[p, j] := RealDigits[p, 2, 1, -j][[1]][[1]]

где

BinaryExpansionBit[x, i]

дает би, о которых я говорил.

2 ответа

Решение

Это зависит от того, что вы подразумеваете под "эффективным". Mathematica может легко преобразовать в двоичный файл, как показывает этот пример Wolfram Alpha.

В противном случае вы ищете соотношение целочисленной части x * 2^i,

Я не вижу, что не так с RealDigits.

rd=RealDigits[0.1,2]

дает хорошее двоичное расширение:

(* out: 
    {{1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0,
   0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 
  1, 0, 0, 1, 1, 0, 1, 0}, -3} 
*)

тестирование:

rd[[1]].Table[1/2^(n - rd[[2]]), {n, Length[rd[[1]]]}]

(* out: 3602879701896397 / 36028797018963968, which is 0.1*)

Второй элемент RealDigitВыходные данные сообщают вам местоположение первого элемента относительно десятичной точки. Итак, для реального г, 0<r<1 ваш bi = rd[[1,i-rd[[2]]],

Другие вопросы по тегам