move abs and expt
This commit is contained in:
parent
6551506160
commit
57e4942ae2
|
@ -246,13 +246,45 @@ pic_number_sqrt(pic_state *pic)
|
|||
return pic_float_value(sqrt(f));
|
||||
}
|
||||
|
||||
static pic_value
|
||||
pic_number_abs(pic_state *pic)
|
||||
{
|
||||
double f;
|
||||
bool e;
|
||||
|
||||
pic_get_args(pic, "F", &f, &e);
|
||||
|
||||
if (e) {
|
||||
return pic_int_value(f < 0 ? -f : f);
|
||||
}
|
||||
else {
|
||||
return pic_float_value(fabs(f));
|
||||
}
|
||||
}
|
||||
|
||||
static pic_value
|
||||
pic_number_expt(pic_state *pic)
|
||||
{
|
||||
double f, g, h;
|
||||
bool e1, e2;
|
||||
|
||||
pic_get_args(pic, "FF", &f, &e1, &g, &e2);
|
||||
|
||||
h = pow(f, g);
|
||||
if (e1 && e2) {
|
||||
if (h <= INT_MAX) {
|
||||
return pic_int_value((int)h);
|
||||
}
|
||||
}
|
||||
return pic_float_value(h);
|
||||
}
|
||||
|
||||
void
|
||||
pic_init_math(pic_state *pic)
|
||||
{
|
||||
pic_deflibrary (pic, "(picrin math)") {
|
||||
pic_defun(pic, "floor/", pic_number_floor2);
|
||||
pic_defun(pic, "truncate/", pic_number_trunc2);
|
||||
|
||||
pic_defun(pic, "floor", pic_number_floor);
|
||||
pic_defun(pic, "ceiling", pic_number_ceil);
|
||||
pic_defun(pic, "truncate", pic_number_trunc);
|
||||
|
@ -270,5 +302,7 @@ pic_init_math(pic_state *pic)
|
|||
pic_defun(pic, "acos", pic_number_acos);
|
||||
pic_defun(pic, "asin", pic_number_asin);
|
||||
pic_defun(pic, "atan", pic_number_atan);
|
||||
pic_defun(pic, "abs", pic_number_abs);
|
||||
pic_defun(pic, "expt", pic_number_expt);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
(define-library (scheme base)
|
||||
(import (picrin base)
|
||||
(only (picrin math)
|
||||
abs
|
||||
expt
|
||||
floor/
|
||||
truncate/
|
||||
floor
|
||||
|
|
|
@ -347,70 +347,6 @@ DEFINE_ARITH_INV_OP2(-, sub, 0)
|
|||
DEFINE_ARITH_INV_OP2(/, div, 1)
|
||||
#endif
|
||||
|
||||
static pic_value
|
||||
pic_number_abs(pic_state *pic)
|
||||
{
|
||||
#if PIC_ENABLE_FLOAT
|
||||
double f;
|
||||
bool e;
|
||||
|
||||
pic_get_args(pic, "F", &f, &e);
|
||||
|
||||
if (e) {
|
||||
return pic_int_value(f < 0 ? -f : f);
|
||||
}
|
||||
else {
|
||||
return pic_float_value(fabs(f));
|
||||
}
|
||||
#else
|
||||
int i;
|
||||
|
||||
pic_get_args(pic, "i", &i);
|
||||
|
||||
return pic_int_value(i < 0 ? -i : i);
|
||||
#endif
|
||||
}
|
||||
|
||||
static pic_value
|
||||
pic_number_expt(pic_state *pic)
|
||||
{
|
||||
#if PIC_ENABLE_FLOAT
|
||||
double f, g, h;
|
||||
bool e1, e2;
|
||||
|
||||
pic_get_args(pic, "FF", &f, &e1, &g, &e2);
|
||||
|
||||
h = pow(f, g);
|
||||
if (e1 && e2) {
|
||||
if (h <= INT_MAX) {
|
||||
return pic_int_value((int)h);
|
||||
}
|
||||
}
|
||||
return pic_float_value(h);
|
||||
#else
|
||||
int x, y, i, e = 1, r = 1, s = 0;
|
||||
|
||||
pic_get_args(pic, "ii", &x, &y);
|
||||
|
||||
if (y < 0) {
|
||||
s = 1;
|
||||
y = -y;
|
||||
}
|
||||
e = x;
|
||||
for (i = 0; y; ++i) {
|
||||
if ((y & 1) != 0) {
|
||||
r *= e;
|
||||
}
|
||||
e *= e;
|
||||
y >>= 1;
|
||||
}
|
||||
if (s != 0) {
|
||||
r = 1 / r;
|
||||
}
|
||||
return pic_int_value(r);
|
||||
#endif
|
||||
}
|
||||
|
||||
static pic_value
|
||||
pic_number_number_to_string(pic_state *pic)
|
||||
{
|
||||
|
@ -555,10 +491,6 @@ pic_init_number(pic_state *pic)
|
|||
pic_defun(pic, "/", pic_number_div);
|
||||
pic_gc_arena_restore(pic, ai);
|
||||
|
||||
pic_defun(pic, "abs", pic_number_abs);
|
||||
pic_defun(pic, "expt", pic_number_expt);
|
||||
pic_gc_arena_restore(pic, ai);
|
||||
|
||||
pic_defun(pic, "number->string", pic_number_number_to_string);
|
||||
pic_defun(pic, "string->number", pic_number_string_to_number);
|
||||
pic_gc_arena_restore(pic, ai);
|
||||
|
|
Loading…
Reference in New Issue