Эффективный способ получить бит в двоичном разложении [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]]]
,