#include <math.h>
#include <complex.h>
#include <stdlib.h>
#include <iostream.h>


void pbase(char *bla, double x, int base);
double zzz2(double x);


int main(int argc, char **argv)
{
    double x;

    x=0.5;
    zzz2(x);

    return 0;
}
// --------------------------



#define d_n(x)  (x<0?1:0) 

double zzz2(double x)
{
    int    k,b,m;
    double v,tp,y,z;


    cout.form("\n     x=%.19g \n",x);
    y=acos(x/2.0)/M_PI;
    cout.form(" acos(x/2)/Pi=%.19g  \n",y);
    pbase("   =",y,2);

    tp=1.0;
    v=0.0;
    m=0;

    for(k=0; k<35; ++k)
    {
        cout.form(" k=%2d: x=%-+011g  ",k,x);

        z=cos(y*pow(2.0,k)*M_PI);
        cout.form(" yy=%-+011g  zz=%-+011g  ",z,2.0*z*z-1.0);

        m=m^d_n(x);

        tp/=2;
        v+=m*tp;
        /*
          y=2.0*(y-floor(y));
          b=(int)floor(y);
          cout.form(" (b=%1d) ",b);
          */
        cout.form(" [%1d] d_n(x)=%1d \n",m,d_n(x));

        x=x*x-2.0;
    }

    cout.form("\n     v=%.19g \n",v);
    pbase("   =",v,2);

    return v;
}
// --------------------------


void pbase(char *bla, double x, int base)
{
    char hx[]="0123456789abcdefghijklmnopqrstuvwxyz";
    int n;
    double y;


    cout<<bla<<" base "<<base<<"  = ";

    y=fabs(x);

    n=(int)(2.0+53.0/(log((double)(base))/log(2.0)));  // number of digits to print 

    for(int i=1; i<=n; ++i)
    {
        y=(double)base*(y-floor(y));

        cout<<hx[(int)floor(y)];
    }

    cout<<endl;
}
// --------------------------


