/* preliminaries */
double dac(int* b, int B, double R);
int u(double x) {
if (x >= 0)
{return 1;}
return 0;
}
/* adc.c - successive approximation A/D converter */
void adc(double x, int *b, int B, double R) {
int i;
double y, xQ, Q;
Q = R / (double) (1 < < B); // initialization
y = x + Q/2;
for (int i=0; i < B; i++)
{b[i] = 0;}
b[0] = 1 - u(y); // determine MSB
for (int i=1; i < B; i++) {
b[i] = 1; // turn ith bit on
xQ = dac(b, B, R); // compute DAC output
b[i] = u(y - xQ); // test and correct bit
}