0

よく知られているように、[0,1]の実数は、基数1/2の2進展開として記述できます。

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

与えられたxとインデックスiに対してbiを取得する効率的な方法が欲しいのですが、Mathematicaでそれを行うための組み込みの方法はないと思います。IntegerDigitsとRealDigitsは役に立たないようで、関連する関数はどれも適切ではありません。

明らかな解決策は手動変換を行うことですが、私はそれを避けたいと思っていました。私は何かが足りないのですか?

編集:将来の参考のために、私が探していたものはこの方法で行うことができます、

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

どこ

BinaryExpansionBit[x, i]

私が話していたbiを与えます。

4

2 に答える 2

4

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*)

の出力の2番目の要素はRealDigit、小数点に対する最初の要素の位置を示します。したがって、実際のrの場合、0<r<1あなたのbi = rd[[1,i-rd[[2]]]

于 2011-07-23T22:00:58.393 に答える
1

それはあなたが「効率的」とは何を意味するかによります。このWolframAlphaの例が示すように、Mathematicaは簡単にバイナリに変換できます。

それ以外の場合、探しているのはの整数部分のパリティですx * 2^i

于 2011-07-23T19:56:50.207 に答える