move some math procedures to math nitro
This commit is contained in:
parent
0f9c7f0c2c
commit
d66ae479cc
|
@ -0,0 +1,161 @@
|
||||||
|
#include "picrin.h"
|
||||||
|
|
||||||
|
static pic_value
|
||||||
|
pic_number_finite_p(pic_state *pic)
|
||||||
|
{
|
||||||
|
pic_value v;
|
||||||
|
|
||||||
|
pic_get_args(pic, "o", &v);
|
||||||
|
|
||||||
|
if (pic_int_p(v))
|
||||||
|
return pic_true_value();
|
||||||
|
if (pic_float_p(v) && ! (isinf(pic_float(v)) || isnan(pic_float(v))))
|
||||||
|
return pic_true_value();
|
||||||
|
else
|
||||||
|
return pic_false_value();
|
||||||
|
}
|
||||||
|
|
||||||
|
static pic_value
|
||||||
|
pic_number_infinite_p(pic_state *pic)
|
||||||
|
{
|
||||||
|
pic_value v;
|
||||||
|
|
||||||
|
pic_get_args(pic, "o", &v);
|
||||||
|
|
||||||
|
if (pic_float_p(v) && isinf(pic_float(v)))
|
||||||
|
return pic_true_value();
|
||||||
|
else
|
||||||
|
return pic_false_value();
|
||||||
|
}
|
||||||
|
|
||||||
|
static pic_value
|
||||||
|
pic_number_nan_p(pic_state *pic)
|
||||||
|
{
|
||||||
|
pic_value v;
|
||||||
|
|
||||||
|
pic_get_args(pic, "o", &v);
|
||||||
|
|
||||||
|
if (pic_float_p(v) && isnan(pic_float(v)))
|
||||||
|
return pic_true_value();
|
||||||
|
else
|
||||||
|
return pic_false_value();
|
||||||
|
}
|
||||||
|
|
||||||
|
static pic_value
|
||||||
|
pic_number_exp(pic_state *pic)
|
||||||
|
{
|
||||||
|
double f;
|
||||||
|
|
||||||
|
pic_get_args(pic, "f", &f);
|
||||||
|
return pic_float_value(exp(f));
|
||||||
|
}
|
||||||
|
|
||||||
|
static pic_value
|
||||||
|
pic_number_log(pic_state *pic)
|
||||||
|
{
|
||||||
|
double f,g;
|
||||||
|
int argc;
|
||||||
|
|
||||||
|
argc = pic_get_args(pic, "f|f", &f, &g);
|
||||||
|
if (argc == 1) {
|
||||||
|
return pic_float_value(log(f));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return pic_float_value(log(f) / log(g));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static pic_value
|
||||||
|
pic_number_sin(pic_state *pic)
|
||||||
|
{
|
||||||
|
double f;
|
||||||
|
|
||||||
|
pic_get_args(pic, "f", &f);
|
||||||
|
f = sin(f);
|
||||||
|
return pic_float_value(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
static pic_value
|
||||||
|
pic_number_cos(pic_state *pic)
|
||||||
|
{
|
||||||
|
double f;
|
||||||
|
|
||||||
|
pic_get_args(pic, "f", &f);
|
||||||
|
f = cos(f);
|
||||||
|
return pic_float_value(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
static pic_value
|
||||||
|
pic_number_tan(pic_state *pic)
|
||||||
|
{
|
||||||
|
double f;
|
||||||
|
|
||||||
|
pic_get_args(pic, "f", &f);
|
||||||
|
f = tan(f);
|
||||||
|
return pic_float_value(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
static pic_value
|
||||||
|
pic_number_acos(pic_state *pic)
|
||||||
|
{
|
||||||
|
double f;
|
||||||
|
|
||||||
|
pic_get_args(pic, "f", &f);
|
||||||
|
f = acos(f);
|
||||||
|
return pic_float_value(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
static pic_value
|
||||||
|
pic_number_asin(pic_state *pic)
|
||||||
|
{
|
||||||
|
double f;
|
||||||
|
|
||||||
|
pic_get_args(pic, "f", &f);
|
||||||
|
f = asin(f);
|
||||||
|
return pic_float_value(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
static pic_value
|
||||||
|
pic_number_atan(pic_state *pic)
|
||||||
|
{
|
||||||
|
double f,g;
|
||||||
|
int argc;
|
||||||
|
|
||||||
|
argc = pic_get_args(pic, "f|f", &f, &g);
|
||||||
|
if (argc == 1) {
|
||||||
|
f = atan(f);
|
||||||
|
return pic_float_value(f);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return pic_float_value(atan2(f,g));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static pic_value
|
||||||
|
pic_number_sqrt(pic_state *pic)
|
||||||
|
{
|
||||||
|
double f;
|
||||||
|
|
||||||
|
pic_get_args(pic, "f", &f);
|
||||||
|
|
||||||
|
return pic_float_value(sqrt(f));
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
pic_init_math(pic_state *pic)
|
||||||
|
{
|
||||||
|
pic_deflibrary (pic, "(picrin number)") {
|
||||||
|
pic_defun(pic, "finite?", pic_number_finite_p);
|
||||||
|
pic_defun(pic, "infinite?", pic_number_infinite_p);
|
||||||
|
pic_defun(pic, "nan?", pic_number_nan_p);
|
||||||
|
pic_defun(pic, "sqrt", pic_number_sqrt);
|
||||||
|
pic_defun(pic, "exp", pic_number_exp);
|
||||||
|
pic_defun(pic, "log", pic_number_log);
|
||||||
|
pic_defun(pic, "sin", pic_number_sin);
|
||||||
|
pic_defun(pic, "cos", pic_number_cos);
|
||||||
|
pic_defun(pic, "tan", pic_number_tan);
|
||||||
|
pic_defun(pic, "acos", pic_number_acos);
|
||||||
|
pic_defun(pic, "asin", pic_number_asin);
|
||||||
|
pic_defun(pic, "atan", pic_number_atan);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
CONTRIB_INITS += math
|
||||||
|
|
||||||
|
CONTRIB_SRCS += contrib/10.math/math.c
|
|
@ -1,5 +1,6 @@
|
||||||
(define-library (scheme base)
|
(define-library (scheme base)
|
||||||
(import (picrin base)
|
(import (picrin base)
|
||||||
|
(only (picrin number) sqrt)
|
||||||
(picrin macro)
|
(picrin macro)
|
||||||
(picrin string)
|
(picrin string)
|
||||||
(scheme file))
|
(scheme file))
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
(define-library (scheme inexact)
|
(define-library (scheme inexact)
|
||||||
(import (picrin base))
|
(import (picrin base)
|
||||||
|
(picrin number))
|
||||||
|
|
||||||
(export acos
|
(export acos
|
||||||
asin
|
asin
|
||||||
|
|
|
@ -655,149 +655,6 @@ pic_number_string_to_number(pic_state *pic)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#if PIC_ENABLE_FLOAT
|
|
||||||
static pic_value
|
|
||||||
pic_number_finite_p(pic_state *pic)
|
|
||||||
{
|
|
||||||
pic_value v;
|
|
||||||
|
|
||||||
pic_get_args(pic, "o", &v);
|
|
||||||
|
|
||||||
if (pic_int_p(v))
|
|
||||||
return pic_true_value();
|
|
||||||
if (pic_float_p(v) && ! (isinf(pic_float(v)) || isnan(pic_float(v))))
|
|
||||||
return pic_true_value();
|
|
||||||
else
|
|
||||||
return pic_false_value();
|
|
||||||
}
|
|
||||||
|
|
||||||
static pic_value
|
|
||||||
pic_number_infinite_p(pic_state *pic)
|
|
||||||
{
|
|
||||||
pic_value v;
|
|
||||||
|
|
||||||
pic_get_args(pic, "o", &v);
|
|
||||||
|
|
||||||
if (pic_float_p(v) && isinf(pic_float(v)))
|
|
||||||
return pic_true_value();
|
|
||||||
else
|
|
||||||
return pic_false_value();
|
|
||||||
}
|
|
||||||
|
|
||||||
static pic_value
|
|
||||||
pic_number_nan_p(pic_state *pic)
|
|
||||||
{
|
|
||||||
pic_value v;
|
|
||||||
|
|
||||||
pic_get_args(pic, "o", &v);
|
|
||||||
|
|
||||||
if (pic_float_p(v) && isnan(pic_float(v)))
|
|
||||||
return pic_true_value();
|
|
||||||
else
|
|
||||||
return pic_false_value();
|
|
||||||
}
|
|
||||||
|
|
||||||
static pic_value
|
|
||||||
pic_number_exp(pic_state *pic)
|
|
||||||
{
|
|
||||||
double f;
|
|
||||||
|
|
||||||
pic_get_args(pic, "f", &f);
|
|
||||||
return pic_float_value(exp(f));
|
|
||||||
}
|
|
||||||
|
|
||||||
static pic_value
|
|
||||||
pic_number_log(pic_state *pic)
|
|
||||||
{
|
|
||||||
double f,g;
|
|
||||||
int argc;
|
|
||||||
|
|
||||||
argc = pic_get_args(pic, "f|f", &f, &g);
|
|
||||||
if (argc == 1) {
|
|
||||||
return pic_float_value(log(f));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return pic_float_value(log(f) / log(g));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static pic_value
|
|
||||||
pic_number_sin(pic_state *pic)
|
|
||||||
{
|
|
||||||
double f;
|
|
||||||
|
|
||||||
pic_get_args(pic, "f", &f);
|
|
||||||
f = sin(f);
|
|
||||||
return pic_float_value(f);
|
|
||||||
}
|
|
||||||
|
|
||||||
static pic_value
|
|
||||||
pic_number_cos(pic_state *pic)
|
|
||||||
{
|
|
||||||
double f;
|
|
||||||
|
|
||||||
pic_get_args(pic, "f", &f);
|
|
||||||
f = cos(f);
|
|
||||||
return pic_float_value(f);
|
|
||||||
}
|
|
||||||
|
|
||||||
static pic_value
|
|
||||||
pic_number_tan(pic_state *pic)
|
|
||||||
{
|
|
||||||
double f;
|
|
||||||
|
|
||||||
pic_get_args(pic, "f", &f);
|
|
||||||
f = tan(f);
|
|
||||||
return pic_float_value(f);
|
|
||||||
}
|
|
||||||
|
|
||||||
static pic_value
|
|
||||||
pic_number_acos(pic_state *pic)
|
|
||||||
{
|
|
||||||
double f;
|
|
||||||
|
|
||||||
pic_get_args(pic, "f", &f);
|
|
||||||
f = acos(f);
|
|
||||||
return pic_float_value(f);
|
|
||||||
}
|
|
||||||
|
|
||||||
static pic_value
|
|
||||||
pic_number_asin(pic_state *pic)
|
|
||||||
{
|
|
||||||
double f;
|
|
||||||
|
|
||||||
pic_get_args(pic, "f", &f);
|
|
||||||
f = asin(f);
|
|
||||||
return pic_float_value(f);
|
|
||||||
}
|
|
||||||
|
|
||||||
static pic_value
|
|
||||||
pic_number_atan(pic_state *pic)
|
|
||||||
{
|
|
||||||
double f,g;
|
|
||||||
int argc;
|
|
||||||
|
|
||||||
argc = pic_get_args(pic, "f|f", &f, &g);
|
|
||||||
if (argc == 1) {
|
|
||||||
f = atan(f);
|
|
||||||
return pic_float_value(f);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return pic_float_value(atan2(f,g));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static pic_value
|
|
||||||
pic_number_sqrt(pic_state *pic)
|
|
||||||
{
|
|
||||||
double f;
|
|
||||||
|
|
||||||
pic_get_args(pic, "f", &f);
|
|
||||||
|
|
||||||
return pic_float_value(sqrt(f));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void
|
void
|
||||||
pic_init_number(pic_state *pic)
|
pic_init_number(pic_state *pic)
|
||||||
{
|
{
|
||||||
|
@ -856,20 +713,4 @@ pic_init_number(pic_state *pic)
|
||||||
pic_defun(pic, "number->string", pic_number_number_to_string);
|
pic_defun(pic, "number->string", pic_number_number_to_string);
|
||||||
pic_defun(pic, "string->number", pic_number_string_to_number);
|
pic_defun(pic, "string->number", pic_number_string_to_number);
|
||||||
pic_gc_arena_restore(pic, ai);
|
pic_gc_arena_restore(pic, ai);
|
||||||
|
|
||||||
#if PIC_ENABLE_FLOAT
|
|
||||||
pic_defun(pic, "finite?", pic_number_finite_p);
|
|
||||||
pic_defun(pic, "infinite?", pic_number_infinite_p);
|
|
||||||
pic_defun(pic, "nan?", pic_number_nan_p);
|
|
||||||
pic_defun(pic, "sqrt", pic_number_sqrt);
|
|
||||||
pic_defun(pic, "exp", pic_number_exp);
|
|
||||||
pic_defun(pic, "log", pic_number_log);
|
|
||||||
pic_defun(pic, "sin", pic_number_sin);
|
|
||||||
pic_defun(pic, "cos", pic_number_cos);
|
|
||||||
pic_defun(pic, "tan", pic_number_tan);
|
|
||||||
pic_defun(pic, "acos", pic_number_acos);
|
|
||||||
pic_defun(pic, "asin", pic_number_asin);
|
|
||||||
pic_defun(pic, "atan", pic_number_atan);
|
|
||||||
pic_gc_arena_restore(pic, ai);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue