#include #include extern char **argvec; int n0; int n; unsigned char *p2; unsigned char *left; unsigned char *sum; unsigned char *bits; unsigned char *num; char *fmtbuf; int exp2; int exp10; unsigned char **numlist[] = { &p2, &left, &sum, &bits, &num, 0 }; void alloc() { int i; for (i=0;numlist[i];i++) { *numlist[i] = (unsigned char *) malloc(n); } fmtbuf = malloc(n+1); } void grownum(addl) int addl; { int i; for (i=0;numlist[i];i++) { *numlist[i] = (unsigned char *) realloc((char *)*numlist[i],n+addl); bzero(n+*numlist[i],addl); } fmtbuf = realloc(fmtbuf,n+addl+1); n += addl; } char *fmtnum(num) unsigned char *num; { int i; for (i=0;i 4) { if (e10p) (*e10p) ++; if (num[n-1] % 5) { grownum(1); num = *np; } t = num[n-1] / 5; i = n - 1; j = n; } else { t = 0; i = n; j = n; } while (i > 0) { t += 2 * num[--i]; if (t < 10) { num[--j] = t; t = 0; } else { num[--j] = t - 10; t = 1; } } if (j > 0) { num[--j] = t; } else if (t) { fprintf("xmul2 panic 1\n"); abort(); } } expadjust() { exp2 = 0; while (exp10 > 0) { xdiv2(&num,&exp10); exp2 ++; printf(" expadjust: %s exp10=%d exp2=%d\n",fmtnum(num),exp10,exp2); } while ((exp10 < 0) || (num[0] < 5)) { xmul2(&num,&exp10); exp2 --; printf(" expadjust: %s exp10=%d exp2=%d\n",fmtnum(num),exp10,exp2); } } tobinary() { int b; int i; int t; int nz; printf(" tobinary: %s\n",fmtnum(num)); bcopy(num,left,n); bzero(p2,n); bzero(sum,n); p2[0] = 5; b = 0; while (b < n0) { t = 1; for (i=0;i left[i]) t = 0; break; } bits[b++] = t; if (t) { t = 0; nz = 0; for (i=n-1;i>=0;i--) { t = left[i] - p2[i] - t; if (t < 0) { left[i] = t + 10; t = 1; } else { left[i] = t; t = 0; } if (left[i]) nz = 1; } if (t) { fprintf(stderr,"tobinary panic 1\n"); abort(); } t = 0; for (i=n-1;i>=0;i--) { t += p2[i] + sum[i]; if (t < 10) { sum[i] = t; t = 0; } else { sum[i] = t - 10; t = 1; } } printf("tobinary -: %s\n",fmtnum(p2)); printf("tobinary =: %s\n",fmtnum(left)); } if (! nz) break; t = 0; for (i=0;i 0) { for (i=exp2;i>0;i--) { xmul2(&sum,(int *)0); printf(" sumadjust: %s\n",fmtnum(sum)); } } printf(" sum: %s\n",fmtnum(sum)); } main(ac,av) int ac; char **av; { if (ac != 3) { fprintf(stderr,"Usage: %s nbits number\n",argvec[0]); exit(1); } n = atoi(av[1]); n0 = n; alloc(); initnum(av[2]); expadjust(); tobinary(); sumadjust(); exit(0); }