Re: Re: ReadDigits
- To: mathgroup at christensen.cybernetics.net
- Subject: [mg1812] Re: [mg1760] Re: ReadDigits
- From: Allan Hayes <hay at haystack.demon.co.uk>
- Date: Mon, 31 Jul 1995 23:09:29 -0400
In article <3ui5a6$231 at news0.cybernetics.net>, insshc at gsusgi2.gsu.edu
(Samuel H. Cox) wrote:
> The function RealDigits[x, b] returns a list of two items. For
example,
> RealDigits[Pi //N]
> {{3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9, 3}, 1}
>
> What is the inverse of this function? That is, given the base b, a
> list {...} of base b digits, and an interger n, how do we
elegantly obtain x for which RealDigits[x, b] = {{...},n}?
In [mg1760] Massimo Cafaro <m.cafaro at agora.stm.it>
responded:
>The code below solve the problem. It can be improved to gain
> elegance.
>
> Inv[b_,list_,n_]:=
> Module[{d,nber,x},
> d=Dimensions[list][[1]];
> nber=0;
> Do[x=list[[i]];nber=N[nber+x*10^(n-i),d],{i,d}];
> Print[nber]
> ];
Here is a variant of this code, where {r,n} is RealDigits[x,b] for
the real number x that we want to recover.
Inv2[{r_,n_}, b_:10]:=
Module[{nber,d},
d = Length[r];
nber=0;
Do[nber= nber+r[[i]]*10^(n-i),{i,d}]; (*exact arithmetic*)
N[nber,d] (*output the answer*)
];
(it also uses the n automatically)
A more functional form is
Inv3[{r_,n_},b_:10] := N[(b^(n-Range[#])).r, #]&[Length[r]];
Comparison:
rd = RealDigits[N[Pi]]
{{3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9, 3}, 1}
Inv2[rd]//Timing
{0.05 Second, 3.141592653589793}
Inv3[rd]//Timing
{0.0166667 Second, 3.141592653589793}
Problem:
A problem arises when b is not 10: for example,when b is 2, we can
get too many digits
N[Pi]
3.141592653589793
rd2 = RealDigits[%, 2];
Inv3[rd2,2]
3.14159265358979311599796346854418516159057617187500000
Adjustment:
The following adjustment nearly corrects this
Inv4[{r_,n_},b_:10] :=
N[
(b^(n-Range[#])).r,
Ceiling[#] N[Log[b]/Log[10]]
]&[Length[r]];
Inv4[rd2,2]
3.141592653589793
But not quite:
N[Pi,30]
3.14159265358979323846264338328
rd3 = RealDigits[%, 2];
Inv4[rd3,2]
3.141592653589793238462643383279
Allan Hayes
De Montfort University Leicester
hay at haystack.demon.co.uk