// Report some extrema. #include #include #define C const typedef double R; typedef unsigned long int ul; typedef union{R r; ul i;} U; static R rf(){return 0x1.p-31*random() + 0x1.p-62*random();} static R l2R(ul x){return ((U)x).r;} static ul R2l(R x){return ((U)x).i;} static ul j(short h, ul a){return (ul)h<<52 | (a & ((1L<<52)-1));} static int max = 0, min = 1<<12, mer = 0, ser = 0; static ul Ndmin = -1; R fdiv(C R n, C R d){C ul a = R2l(n), b = R2l(d); C ul nf = j(1, a), df = j(1, b); C char ad = nf < df; C short N = (1<<20)/((df>>42)+1); // table lookup! M=8, z=2 max = max=0) {C short nq = r>>54; r = (r<<8) - Nd*nq; q = (q<<8)+nq; rb -= 8;} {int uer = r/Nd; ser += uer; mer = mer= Nd){r -= Nd; ++q;} return l2R(j(1023 + (a>>52) - (b>>52) - ad, ((q>>-rb)+1)>>1));} void t(R a, R b) {if (a/b != fdiv(a, b)) exit(printf("%20.17f %20.17f\n", a, b));} int main(){for(int r=0; r<100000000; ++r) t(rf(), rf()); printf("max = %d, min = %d, mer = %d, ser = %d, Ndmin = %016lX 😊\n", max, min, mer, ser, Ndmin); return 0;} // max = 1023, min = 512, mer = 2, ser = 20663718, Ndmin = 3FD92003E8983150