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

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

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

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

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

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

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

, где

BinaryExpansionBit[x, i]

дает bi , о котором я говорил.

Ответы [ 2 ]

4 голосов
/ 24 июля 2011

Я не вижу, что не так с 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]]].

1 голос
/ 23 июля 2011

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

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

...