function
bignum_add(u, v)
{
	return u + v;
}

function
bignum_sub(u, v)
{
	return u - v;
}

function
bignum_mul(u, v)
{
	return u * v;
}

function
bignum_div(u, v)
{
	return Math.floor(u / v);
}

function
bignum_mod(u, v)
{
	return u % v;
}

function
bignum_pow(u, v)
{
	return Math.pow(u, v);
}

function
bignum_root()
{
	return null;
}

function
bignum_cmp(u, v)
{
	if (u < v)
		return -1;
	if (u > v)
		return 1;
	return 0;
}

function
bignum_gcd(u, v)
{
	var r;
	while (v) {
		r = u % v;
		u = v;
		v = r;
	}
	return u;
}

function
bignum_int(n)
{
	return n;
}

function
bignum_atoi(s)
{
	return parseInt(s);
}

function
bignum_itoa(u)
{
	return u.toFixed(0);
}

function
bignum_copy(u)
{
	return u;
}

function
bignum_iszero(u)
{
	return bignum_equal(u, 0);
}

function
bignum_equal(u, n)
{
	return u == n;
}

function
bignum_odd(u)
{
	return u % 2 == 1;
}

function
bignum_uint32(u)
{
	if (u < 0x100000000)
		return u;
	else
		return null;
}

function
bignum_smallnum(u)
{
	if (u < 0x80000000)
		return u;
	else
		return null;
}

function
bignum_issmallnum(u)
{
	return u < 0x80000000;
}

function
bignum_float(u)
{
	return u;
}

const MAXINT = 1e15;

function
push_bignum(sign, a, b)
{
	if (a < MAXINT && b < MAXINT)
		push({sign:sign, a:a, b:b});
	else
		push_double(sign * a / b);
}
