#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define FREQ 13500000.0

#define MMIN 32
#define MMAX 80
#define DMIN  4
#define DMAX 11

void approx(float target)
{
	float fmin, fmax, f;
	float eps, eps1;
	int m, d, p;
	int m1, d1;

	printf("target = %.1f\n",target);

	for (p=8; p>=1; p >>= 1) {
		fmin = FREQ * MMIN / DMAX / p;
		fmax = FREQ * MMAX / DMIN / p;

		if (fmin <= target && target <= fmax)
			break;
	}

	if (p < 1)
		return;

	printf("range  = %.1f..%.1f (%d)\n",fmin, fmax,p);

	m = MMIN;
	d = DMAX;
	f = FREQ * m / d / p;
	eps = fabs(f - target);

	m1 = m;
	d1 = d;
	eps1 = eps;

	for (d = d1; d >= DMIN; --d) {
		while (m > MMIN) {
			f = FREQ * m / d / p;
			eps = fabs(f - target);
			if (eps < eps1) {
				eps1 = eps;
				m1 = m;
				d1 = d;
			}
			if (f <= target)
				break;
			--m;
		}
		while (m < MMAX) {
			f = FREQ * m / d / p;
			eps = fabs(f - target);
			if (eps < eps1) {
				eps1 = eps;
				m1 = m;
				d1 = d;
			}
			if (f >= target)
				break;
			++m;
		}
	}

	f = FREQ * m1 / d1 / p;

	printf("clock  = %.1f (%d,%d,%d)\n",f, m1, d1, p);
	printf("dev    = %.3f\n",eps1/f*100.0);
}

int main(int argc, char *argv[])
{
	int i;

	for (i=1; i<argc; ++i)
		approx(atof(argv[i]));

	return 0;
}
