void insert(int id) { static int space_min = 0; Entry * word = &lexicon[id]; for (;;) { int p,i; match_word(dat, word->key, &p, &i, 0); if (p == word->length) return; get_words_with_prefix(word->key, p); int delta; delta = space_min - words_set_char[0]; for (; delta < DATRIE_SIZE; delta ++) if (words_space_available(delta)) break; if (delta == DATRIE_SIZE) { fprintf(stderr,"DATRIE_SIZE Not Enough!\n"); exit(1); } insert_words(delta, i, p); dat[i].base = delta; while (!unused(space_min)) space_min++; } }
//------------------------------------------------------------------------------ // cbrt(x); Return cube root of x double Cmath::cbrt( double x ) { static const Cmp_unsigned__int32 B1 = 715094163; // B1 = (682-0.03306235651)*2**20 static const Cmp_unsigned__int32 B2 = 696219795; // B2 = (664-0.03306235651)*2**20 static const double C = 5.42857142857142815906e-01; // 19/35 = 0x3FE15F15, 0xF15F15F1 static const double D = -7.05306122448979611050e-01; // -864/1225 = 0xBFE691DE, 0x2532C834 static const double E = 1.41428571428571436819e+00; // 99/70 = 0x3FF6A0EA, 0x0EA0EA0F static const double F = 1.60714285714285720630e+00; // 45/28 = 0x3FF9B6DB, 0x6DB6DB6E static const double G = 3.57142857142857150787e-01; // 5/14 = 0x3FD6DB6D, 0xB6DB6DB7 Cmp_signed__int32 hx; double r, s, t = 0.0, w; Cmp_unsigned__int32 sign; Cmp_unsigned__int32 high, low; get_high_word( hx, x ); sign = hx & 0x80000000; // sign= sign(x) hx ^= sign; if( hx >= 0x7ff00000 ) { return( x + x ); // cbrt(NaN,INF) is itself } get_low_word( low, x ); if( ( hx | low ) == 0 ) { return( x ); // cbrt(0) is itself } set_high_word( x, hx ); // x <- |x| // rough cbrt to 5 bits if( hx < 0x00100000 ) // subnormal number { set_high_word( t, 0x43500000 ); // set t= 2**54 t *= x; get_high_word( high, t ); set_high_word( t, high / 3 + B2 ); } else { set_high_word( t, hx / 3 + B1 ); } // new cbrt to 23 bits, may be implemented in single precision r = t * t / x; s = C + r * t; t *= G + F / ( s + E + D / s ); // chopped to 20 bits and make it larger than cbrt(x) get_high_word( high, t ); insert_words( t, high + 0x00000001, 0 ); // one step newton iteration to 53 bits with error less than 0.667 ulps s = t * t; // t*t is exact r = x / s; w = t + t; r = ( r - t ) / ( w + r ); // r-s is exact t = t + t * r; // retore the sign bit get_high_word( high, t ); set_high_word( t, high | sign ); return t; }