Esempio n. 1
0
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++;
	}
}
Esempio n. 2
0
	//------------------------------------------------------------------------------
	// 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;
	}