updated hak_sqrtint() to return an error if a negative number is given.
added more primitives in the core module
This commit is contained in:
@ -4828,11 +4828,16 @@ hak_oop_t hak_sqrtint (hak_t* hak, hak_oop_t x)
|
||||
if (HAK_UNLIKELY(!a)) goto oops;
|
||||
if (a == hak->_true)
|
||||
{
|
||||
#if 0
|
||||
/* the given number is a negative number.
|
||||
* i will arrange the return value to be negative. */
|
||||
x = hak_negateint(hak, x);
|
||||
if (HAK_UNLIKELY(!x)) goto oops;
|
||||
neg = 1;
|
||||
#else
|
||||
hak_seterrbfmt(hak, HAK_EINVAL, "negative number - %O", x);
|
||||
goto oops;
|
||||
#endif
|
||||
}
|
||||
else neg = 0;
|
||||
|
||||
|
@ -2055,6 +2055,15 @@ hak_pfrc_t hak_pf_number_add (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs);
|
||||
hak_pfrc_t hak_pf_number_sub (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs);
|
||||
hak_pfrc_t hak_pf_number_mul (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs);
|
||||
hak_pfrc_t hak_pf_number_div (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs);
|
||||
hak_pfrc_t hak_pf_number_sqrt (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs);
|
||||
hak_pfrc_t hak_pf_number_abs (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs);
|
||||
|
||||
hak_pfrc_t hak_pf_number_gt (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs);
|
||||
hak_pfrc_t hak_pf_number_ge (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs);
|
||||
hak_pfrc_t hak_pf_number_lt (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs);
|
||||
hak_pfrc_t hak_pf_number_le (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs);
|
||||
hak_pfrc_t hak_pf_number_eq (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs);
|
||||
hak_pfrc_t hak_pf_number_ne (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs);
|
||||
|
||||
hak_pfrc_t hak_pf_process_current (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs);
|
||||
hak_pfrc_t hak_pf_process_fork (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs);
|
||||
|
22
lib/number.c
22
lib/number.c
@ -65,12 +65,12 @@ static hak_ooi_t equalize_scale (hak_t* hak, hak_oop_t* x, hak_oop_t* y)
|
||||
{
|
||||
/* TODO: optmize this. less multiplications */
|
||||
nv = hak_mulints(hak, nv, HAK_SMOOI_TO_OOP(10));
|
||||
if (!nv) return -1;
|
||||
if (HAK_UNLIKELY(!nv)) return -1;
|
||||
xs++;
|
||||
}
|
||||
|
||||
nv = hak_makefpdec(hak, nv, xs);
|
||||
if (!nv) return -1;
|
||||
if (HAK_UNLIKELY(!nv)) return -1;
|
||||
|
||||
*x = nv;
|
||||
}
|
||||
@ -80,12 +80,12 @@ static hak_ooi_t equalize_scale (hak_t* hak, hak_oop_t* x, hak_oop_t* y)
|
||||
while (ys < xs)
|
||||
{
|
||||
nv = hak_mulints(hak, nv, HAK_SMOOI_TO_OOP(10));
|
||||
if (!nv) return -1;
|
||||
if (HAK_UNLIKELY(!nv)) return -1;
|
||||
ys++;
|
||||
}
|
||||
|
||||
nv = hak_makefpdec(hak, nv, ys);
|
||||
if (!nv) return -1;
|
||||
if (HAK_UNLIKELY(!nv)) return -1;
|
||||
|
||||
*y = nv;
|
||||
}
|
||||
@ -104,7 +104,7 @@ hak_oop_t hak_truncfpdecval (hak_t* hak, hak_oop_t iv, hak_ooi_t cs, hak_ooi_t n
|
||||
{
|
||||
/* TODO: optimizatino... less divisions */
|
||||
iv = hak_divints(hak, iv, HAK_SMOOI_TO_OOP(10), 0, HAK_NULL);
|
||||
if (!iv) return HAK_NULL;
|
||||
if (HAK_UNLIKELY(!iv)) return HAK_NULL;
|
||||
cs--;
|
||||
}
|
||||
while (cs > ns);
|
||||
@ -136,7 +136,7 @@ hak_oop_t hak_addnums (hak_t* hak, hak_oop_t x, hak_oop_t y)
|
||||
}
|
||||
v = hak_addints(hak, ((hak_oop_fpdec_t)x)->value, ((hak_oop_fpdec_t)y)->value);
|
||||
hak_popvolats(hak, 2);
|
||||
if (!v) return HAK_NULL;
|
||||
if (HAK_UNLIKELY(!v)) return HAK_NULL;
|
||||
|
||||
return hak_makefpdec(hak, v, scale);
|
||||
}
|
||||
@ -165,7 +165,7 @@ hak_oop_t hak_subnums (hak_t* hak, hak_oop_t x, hak_oop_t y)
|
||||
}
|
||||
v = hak_subints(hak, ((hak_oop_fpdec_t)x)->value, ((hak_oop_fpdec_t)y)->value);
|
||||
hak_popvolats(hak, 2);
|
||||
if (!v) return HAK_NULL;
|
||||
if (HAK_UNLIKELY(!v)) return HAK_NULL;
|
||||
|
||||
return hak_makefpdec(hak, v, scale);
|
||||
}
|
||||
@ -204,7 +204,7 @@ static hak_oop_t mul_nums (hak_t* hak, hak_oop_t x, hak_oop_t y, int mult)
|
||||
}
|
||||
|
||||
nv = hak_mulints(hak, xv, yv);
|
||||
if (!nv) return HAK_NULL;
|
||||
if (HAK_UNLIKELY(!nv)) return HAK_NULL;
|
||||
|
||||
cs = xs + ys;
|
||||
if (cs <= 0) return nv; /* the result must be an integer */
|
||||
@ -216,20 +216,20 @@ static hak_oop_t mul_nums (hak_t* hak, hak_oop_t x, hak_oop_t y, int mult)
|
||||
HAK_ASSERT(hak, ns <= HAK_SMOOI_MAX);
|
||||
|
||||
nv = hak_truncfpdecval(hak, nv, cs, ns);
|
||||
if (!nv) return HAK_NULL;
|
||||
if (HAK_UNLIKELY(!nv)) return HAK_NULL;
|
||||
|
||||
return (ns <= 0)? nv: hak_makefpdec(hak, nv, ns);
|
||||
}
|
||||
|
||||
hak_oop_t hak_mulnums (hak_t* hak, hak_oop_t x, hak_oop_t y)
|
||||
{
|
||||
/* (* 1.00 12.123) => 12.123 */
|
||||
/* * 1.00 12.123 => 12.123, use the wider precision of the either operands */
|
||||
return mul_nums(hak, x, y, 0);
|
||||
}
|
||||
|
||||
hak_oop_t hak_mltnums (hak_t* hak, hak_oop_t x, hak_oop_t y)
|
||||
{
|
||||
/* (mlt 1.00 12.123) => 12.12 */
|
||||
/* mlt 1.00 12.123 => 12.12, use the precision of the first operand */
|
||||
return mul_nums(hak, x, y, 1);
|
||||
}
|
||||
|
||||
|
70
lib/prim.c
70
lib/prim.c
@ -787,7 +787,7 @@ static hak_pfrc_t pf_or (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
|
||||
rv = hak->_false;
|
||||
for (i = 1; i < nargs; i++)
|
||||
{
|
||||
arg = HAK_STACK_GETARG(hak, nargs, i);
|
||||
arg = HAK_STACK_GETARG(hak, nargs, i);
|
||||
if (arg == hak->_true)
|
||||
{
|
||||
rv = hak->_true;
|
||||
@ -821,7 +821,7 @@ hak_pfrc_t hak_pf_number_add (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
|
||||
arg = HAK_STACK_GETARG(hak, nargs, i);
|
||||
/*ret = hak_addints(hak, ret, arg);*/
|
||||
ret = hak_addnums(hak, ret, arg);
|
||||
if (!ret) return HAK_PF_FAILURE;
|
||||
if (HAK_UNLIKELY(!ret)) return HAK_PF_FAILURE;
|
||||
}
|
||||
|
||||
HAK_STACK_SETRET(hak, nargs, ret);
|
||||
@ -839,7 +839,7 @@ hak_pfrc_t hak_pf_number_sub (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
|
||||
arg = HAK_STACK_GETARG(hak, nargs, i);
|
||||
/*ret = hak_subints(hak, ret, arg);*/
|
||||
ret = hak_subnums(hak, ret, arg);
|
||||
if (!ret) return HAK_PF_FAILURE;
|
||||
if (HAK_UNLIKELY(!ret)) return HAK_PF_FAILURE;
|
||||
}
|
||||
|
||||
HAK_STACK_SETRET(hak, nargs, ret);
|
||||
@ -857,7 +857,7 @@ hak_pfrc_t hak_pf_number_mul (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
|
||||
arg = HAK_STACK_GETARG(hak, nargs, i);
|
||||
/*ret = hak_mulints(hak, ret, arg);*/
|
||||
ret = hak_mulnums(hak, ret, arg);
|
||||
if (!ret) return HAK_PF_FAILURE;
|
||||
if (HAK_UNLIKELY(!ret)) return HAK_PF_FAILURE;
|
||||
}
|
||||
|
||||
HAK_STACK_SETRET(hak, nargs, ret);
|
||||
@ -874,7 +874,7 @@ static hak_pfrc_t pf_number_mlt (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
|
||||
{
|
||||
arg = HAK_STACK_GETARG(hak, nargs, i);
|
||||
ret = hak_mltnums(hak, ret, arg);
|
||||
if (!ret) return HAK_PF_FAILURE;
|
||||
if (HAK_UNLIKELY(!ret)) return HAK_PF_FAILURE;
|
||||
}
|
||||
|
||||
HAK_STACK_SETRET(hak, nargs, ret);
|
||||
@ -891,7 +891,7 @@ hak_pfrc_t hak_pf_number_div (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
|
||||
{
|
||||
arg = HAK_STACK_GETARG(hak, nargs, i);
|
||||
ret = hak_divnums(hak, ret, arg);
|
||||
if (!ret) return HAK_PF_FAILURE;
|
||||
if (HAK_UNLIKELY(!ret)) return HAK_PF_FAILURE;
|
||||
}
|
||||
|
||||
HAK_STACK_SETRET(hak, nargs, ret);
|
||||
@ -908,7 +908,7 @@ static hak_pfrc_t pf_integer_quo (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
|
||||
{
|
||||
arg = HAK_STACK_GETARG(hak, nargs, i);
|
||||
ret = hak_divints(hak, ret, arg, 0, HAK_NULL);
|
||||
if (!ret) return HAK_PF_FAILURE;
|
||||
if (HAK_UNLIKELY(!ret)) return HAK_PF_FAILURE;
|
||||
}
|
||||
|
||||
HAK_STACK_SETRET(hak, nargs, ret);
|
||||
@ -925,7 +925,7 @@ static hak_pfrc_t pf_integer_rem (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
|
||||
{
|
||||
arg = HAK_STACK_GETARG(hak, nargs, i);
|
||||
ret = hak_divints(hak, ret, arg, 0, &rem);
|
||||
if (!ret) return HAK_PF_FAILURE;
|
||||
if (HAK_UNLIKELY(!ret)) return HAK_PF_FAILURE;
|
||||
ret = rem;
|
||||
}
|
||||
|
||||
@ -943,7 +943,7 @@ static hak_pfrc_t pf_integer_mquo (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
|
||||
{
|
||||
arg = HAK_STACK_GETARG(hak, nargs, i);
|
||||
ret = hak_divints(hak, ret, arg, 1, HAK_NULL);
|
||||
if (!ret) return HAK_PF_FAILURE;
|
||||
if (HAK_UNLIKELY(!ret)) return HAK_PF_FAILURE;
|
||||
}
|
||||
|
||||
HAK_STACK_SETRET(hak, nargs, ret);
|
||||
@ -960,7 +960,7 @@ static hak_pfrc_t pf_integer_mod (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
|
||||
{
|
||||
arg = HAK_STACK_GETARG(hak, nargs, i);
|
||||
ret = hak_divints(hak, ret, arg, 1, &rem);
|
||||
if (!ret) return HAK_PF_FAILURE;
|
||||
if (HAK_UNLIKELY(!ret)) return HAK_PF_FAILURE;
|
||||
ret = rem;
|
||||
}
|
||||
|
||||
@ -968,79 +968,79 @@ static hak_pfrc_t pf_integer_mod (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
|
||||
return HAK_PF_SUCCESS;
|
||||
}
|
||||
|
||||
static hak_pfrc_t pf_number_sqrt (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
|
||||
hak_pfrc_t hak_pf_number_sqrt (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
|
||||
{
|
||||
hak_oop_t ret;
|
||||
ret = hak_sqrtnum(hak, HAK_STACK_GETARG(hak, nargs, 0));
|
||||
if (!ret) return HAK_PF_FAILURE;
|
||||
if (HAK_UNLIKELY(!ret)) return HAK_PF_FAILURE;
|
||||
|
||||
HAK_STACK_SETRET(hak, nargs, ret);
|
||||
return HAK_PF_SUCCESS;
|
||||
}
|
||||
|
||||
static hak_pfrc_t pf_number_abs (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
|
||||
hak_pfrc_t hak_pf_number_abs (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
|
||||
{
|
||||
hak_oop_t ret;
|
||||
ret = hak_absnum(hak, HAK_STACK_GETARG(hak, nargs, 0));
|
||||
if (!ret) return HAK_PF_FAILURE;
|
||||
if (HAK_UNLIKELY(!ret)) return HAK_PF_FAILURE;
|
||||
|
||||
HAK_STACK_SETRET(hak, nargs, ret);
|
||||
return HAK_PF_SUCCESS;
|
||||
}
|
||||
|
||||
static hak_pfrc_t pf_number_gt (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
|
||||
hak_pfrc_t hak_pf_number_gt (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
|
||||
{
|
||||
hak_oop_t ret;
|
||||
ret = hak_gtnums(hak, HAK_STACK_GETARG(hak, nargs, 0), HAK_STACK_GETARG(hak, nargs, 1));
|
||||
if (!ret) return HAK_PF_FAILURE;
|
||||
if (HAK_UNLIKELY(!ret)) return HAK_PF_FAILURE;
|
||||
|
||||
HAK_STACK_SETRET(hak, nargs, ret);
|
||||
return HAK_PF_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
static hak_pfrc_t pf_number_ge (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
|
||||
hak_pfrc_t hak_pf_number_ge (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
|
||||
{
|
||||
hak_oop_t ret;
|
||||
ret = hak_genums(hak, HAK_STACK_GETARG(hak, nargs, 0), HAK_STACK_GETARG(hak, nargs, 1));
|
||||
if (!ret) return HAK_PF_FAILURE;
|
||||
if (HAK_UNLIKELY(!ret)) return HAK_PF_FAILURE;
|
||||
|
||||
HAK_STACK_SETRET(hak, nargs, ret);
|
||||
return HAK_PF_SUCCESS;
|
||||
}
|
||||
|
||||
static hak_pfrc_t pf_number_lt (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
|
||||
hak_pfrc_t hak_pf_number_lt (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
|
||||
{
|
||||
hak_oop_t ret;
|
||||
ret = hak_ltnums(hak, HAK_STACK_GETARG(hak, nargs, 0), HAK_STACK_GETARG(hak, nargs, 1));
|
||||
if (!ret) return HAK_PF_FAILURE;
|
||||
if (HAK_UNLIKELY(!ret)) return HAK_PF_FAILURE;
|
||||
|
||||
HAK_STACK_SETRET(hak, nargs, ret);
|
||||
return HAK_PF_SUCCESS;
|
||||
}
|
||||
static hak_pfrc_t pf_number_le (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
|
||||
hak_pfrc_t hak_pf_number_le (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
|
||||
{
|
||||
hak_oop_t ret;
|
||||
ret = hak_lenums(hak, HAK_STACK_GETARG(hak, nargs, 0), HAK_STACK_GETARG(hak, nargs, 1));
|
||||
if (!ret) return HAK_PF_FAILURE;
|
||||
if (HAK_UNLIKELY(!ret)) return HAK_PF_FAILURE;
|
||||
|
||||
HAK_STACK_SETRET(hak, nargs, ret);
|
||||
return HAK_PF_SUCCESS;
|
||||
}
|
||||
static hak_pfrc_t pf_number_eq (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
|
||||
hak_pfrc_t hak_pf_number_eq (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
|
||||
{
|
||||
hak_oop_t ret;
|
||||
ret = hak_eqnums(hak, HAK_STACK_GETARG(hak, nargs, 0), HAK_STACK_GETARG(hak, nargs, 1));
|
||||
if (!ret) return HAK_PF_FAILURE;
|
||||
if (HAK_UNLIKELY(!ret)) return HAK_PF_FAILURE;
|
||||
|
||||
HAK_STACK_SETRET(hak, nargs, ret);
|
||||
return HAK_PF_SUCCESS;
|
||||
}
|
||||
static hak_pfrc_t pf_number_ne (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
|
||||
hak_pfrc_t hak_pf_number_ne (hak_t* hak, hak_mod_t* mod, hak_ooi_t nargs)
|
||||
{
|
||||
hak_oop_t ret;
|
||||
ret = hak_nenums(hak, HAK_STACK_GETARG(hak, nargs, 0), HAK_STACK_GETARG(hak, nargs, 1));
|
||||
if (!ret) return HAK_PF_FAILURE;
|
||||
if (HAK_UNLIKELY(!ret)) return HAK_PF_FAILURE;
|
||||
|
||||
HAK_STACK_SETRET(hak, nargs, ret);
|
||||
return HAK_PF_SUCCESS;
|
||||
@ -1321,16 +1321,16 @@ static pf_t builtin_prims[] =
|
||||
{ 1, HAK_TYPE_MAX(hak_oow_t), hak_pf_number_mul, 1, { '*' } },
|
||||
{ 1, HAK_TYPE_MAX(hak_oow_t), pf_number_mlt, 3, { 'm','l','t' } },
|
||||
{ 1, HAK_TYPE_MAX(hak_oow_t), hak_pf_number_div, 1, { '/' } },
|
||||
{ 1, 1, pf_number_sqrt, 4, { 's','q','r','t' } },
|
||||
{ 1, 1, pf_number_abs, 3, { 'a','b','s' } },
|
||||
{ 1, 1, hak_pf_number_sqrt, 4, { 's','q','r','t' } },
|
||||
{ 1, 1, hak_pf_number_abs, 3, { 'a','b','s' } },
|
||||
|
||||
{ 2, 2, pf_number_gt, 1, { '>' } },
|
||||
{ 2, 2, pf_number_ge, 2, { '>','=' } },
|
||||
{ 2, 2, pf_number_lt, 1, { '<' } },
|
||||
{ 2, 2, pf_number_le, 2, { '<','=' } },
|
||||
{ 2, 2, pf_number_eq, 1, { '=' } },
|
||||
{ 2, 2, pf_number_eq, 2, { '=', '=' } },
|
||||
{ 2, 2, pf_number_ne, 2, { '~','=' } },
|
||||
{ 2, 2, hak_pf_number_gt, 1, { '>' } },
|
||||
{ 2, 2, hak_pf_number_ge, 2, { '>','=' } },
|
||||
{ 2, 2, hak_pf_number_lt, 1, { '<' } },
|
||||
{ 2, 2, hak_pf_number_le, 2, { '<','=' } },
|
||||
{ 2, 2, hak_pf_number_eq, 1, { '=' } },
|
||||
{ 2, 2, hak_pf_number_eq, 2, { '=', '=' } },
|
||||
{ 2, 2, hak_pf_number_ne, 2, { '~','=' } },
|
||||
|
||||
/* bitwise operations are supported for integers only */
|
||||
{ 2, 2, pf_integer_band, 7, { 'b','i','t','-','a','n','d' } },
|
||||
|
Reference in New Issue
Block a user