mruby/c VM Source Code release 4.0.0
Loading...
Searching...
No Matches
c_math.c
Go to the documentation of this file.
1
14
15/***** Feature test switches ************************************************/
16/***** System headers *******************************************************/
17//@cond
18#include "vm_config.h"
19#include <math.h>
20//@endcond
21
22/***** Local headers ********************************************************/
23#include "mrubyc.h"
24
25/***** Constat values *******************************************************/
26/***** Macros ***************************************************************/
27/***** Typedefs *************************************************************/
28/***** Function prototypes **************************************************/
29/***** Local variables ******************************************************/
30/***** Global variables *****************************************************/
31/***** Signal catching functions ********************************************/
32/***** Local functions ******************************************************/
33#if MRBC_USE_FLOAT && MRBC_USE_MATH
34//================================================================
37static double to_double( mrbc_vm *vm, const mrbc_value *v )
38{
39 switch( mrbc_type(*v) ) {
40 case MRBC_TT_INTEGER: return (double)v->i;
41 case MRBC_TT_FLOAT: return (double)v->d;
42 default: break;
43 }
44
45 mrbc_raise(vm, MRBC_CLASS(TypeError), 0);
46 return 0.0;
47}
48
49//================================================================
52static void c_math_acos(mrbc_vm *vm, mrbc_value v[], int argc)
53{
54 v[0] = mrbc_float_value(vm, acos( to_double(vm, &v[1]) ));
55}
56
57//================================================================
60static void c_math_acosh(mrbc_vm *vm, mrbc_value v[], int argc)
61{
62 v[0] = mrbc_float_value(vm, acosh( to_double(vm, &v[1]) ));
63}
64
65//================================================================
68static void c_math_asin(mrbc_vm *vm, mrbc_value v[], int argc)
69{
70 v[0] = mrbc_float_value(vm, asin( to_double(vm, &v[1]) ));
71}
72
73//================================================================
76static void c_math_asinh(mrbc_vm *vm, mrbc_value v[], int argc)
77{
78 v[0] = mrbc_float_value(vm, asinh( to_double(vm, &v[1]) ));
79}
80
81//================================================================
84static void c_math_atan(mrbc_vm *vm, mrbc_value v[], int argc)
85{
86 v[0] = mrbc_float_value(vm, atan( to_double(vm, &v[1]) ));
87}
88
89//================================================================
92static void c_math_atan2(mrbc_vm *vm, mrbc_value v[], int argc)
93{
94 v[0] = mrbc_float_value(vm, atan2( to_double(vm, &v[1]), to_double(vm, &v[2]) ));
95}
96
97//================================================================
100static void c_math_atanh(mrbc_vm *vm, mrbc_value v[], int argc)
101{
102 v[0] = mrbc_float_value(vm, atanh( to_double(vm, &v[1]) ));
103}
104
105//================================================================
108static void c_math_cbrt(mrbc_vm *vm, mrbc_value v[], int argc)
109{
110 v[0] = mrbc_float_value(vm, cbrt( to_double(vm, &v[1]) ));
111}
112
113//================================================================
116static void c_math_cos(mrbc_vm *vm, mrbc_value v[], int argc)
117{
118 v[0] = mrbc_float_value(vm, cos( to_double(vm, &v[1]) ));
119}
120
121//================================================================
124static void c_math_cosh(mrbc_vm *vm, mrbc_value v[], int argc)
125{
126 v[0] = mrbc_float_value(vm, cosh( to_double(vm, &v[1]) ));
127}
128
129//================================================================
132static void c_math_erf(mrbc_vm *vm, mrbc_value v[], int argc)
133{
134 v[0] = mrbc_float_value(vm, erf( to_double(vm, &v[1]) ));
135}
136
137//================================================================
140static void c_math_erfc(mrbc_vm *vm, mrbc_value v[], int argc)
141{
142 v[0] = mrbc_float_value(vm, erfc( to_double(vm, &v[1]) ));
143}
144
145//================================================================
148static void c_math_exp(mrbc_vm *vm, mrbc_value v[], int argc)
149{
150 v[0] = mrbc_float_value(vm, exp( to_double(vm, &v[1]) ));
151}
152
153//================================================================
156static void c_math_hypot(mrbc_vm *vm, mrbc_value v[], int argc)
157{
158 v[0] = mrbc_float_value(vm, hypot( to_double(vm, &v[1]), to_double(vm, &v[2]) ));
159}
160
161//================================================================
164static void c_math_ldexp(mrbc_vm *vm, mrbc_value v[], int argc)
165{
166 int exp;
167 switch( mrbc_type(v[2]) ) {
168 case MRBC_TT_INTEGER: exp = v[2].i; break;
169 case MRBC_TT_FLOAT: exp = (int)v[2].d; break;
170 default:
171 mrbc_raise(vm, MRBC_CLASS(TypeError), 0);
172 return;
173 }
174
175 v[0] = mrbc_float_value(vm, ldexp( to_double(vm, &v[1]), exp ));
176}
177
178//================================================================
181static void c_math_log(mrbc_vm *vm, mrbc_value v[], int argc)
182{
183 v[0] = mrbc_float_value(vm, log( to_double(vm, &v[1]) ));
184}
185
186//================================================================
189static void c_math_log10(mrbc_vm *vm, mrbc_value v[], int argc)
190{
191 v[0] = mrbc_float_value(vm, log10( to_double(vm, &v[1]) ));
192}
193
194//================================================================
197static void c_math_log2(mrbc_vm *vm, mrbc_value v[], int argc)
198{
199 v[0] = mrbc_float_value(vm, log2( to_double(vm, &v[1]) ));
200}
201
202//================================================================
205static void c_math_sin(mrbc_vm *vm, mrbc_value v[], int argc)
206{
207 v[0] = mrbc_float_value(vm, sin( to_double(vm, &v[1]) ));
208}
209
210//================================================================
213static void c_math_sinh(mrbc_vm *vm, mrbc_value v[], int argc)
214{
215 v[0] = mrbc_float_value(vm, sinh( to_double(vm, &v[1]) ));
216}
217
218//================================================================
221static void c_math_sqrt(mrbc_vm *vm, mrbc_value v[], int argc)
222{
223 v[0] = mrbc_float_value(vm, sqrt( to_double(vm, &v[1]) ));
224}
225
226//================================================================
229static void c_math_tan(mrbc_vm *vm, mrbc_value v[], int argc)
230{
231 v[0] = mrbc_float_value(vm, tan( to_double(vm, &v[1]) ));
232}
233
234//================================================================
237static void c_math_tanh(mrbc_vm *vm, mrbc_value v[], int argc)
238{
239 v[0] = mrbc_float_value(vm, tanh( to_double(vm, &v[1]) ));
240}
241
242/***** Global functions *****************************************************/
243//================================================================
247{
248 static mrbc_value e = mrbc_float_value(0, M_E);
250
251 static mrbc_value pi = mrbc_float_value(0, M_PI);
252 mrbc_set_class_const( MRBC_CLASS(Math), MRBC_SYM(PI), &pi );
253}
254
255/* MRBC_AUTOGEN_METHOD_TABLE
256
257 MODULE("Math")
258 FILE("_autogen_module_math.h")
259
260 METHOD( "acos", c_math_acos )
261 METHOD( "acosh", c_math_acosh )
262 METHOD( "asin", c_math_asin )
263 METHOD( "asinh", c_math_asinh )
264 METHOD( "atan", c_math_atan )
265 METHOD( "atan2", c_math_atan2 )
266 METHOD( "atanh", c_math_atanh )
267 METHOD( "cbrt", c_math_cbrt )
268 METHOD( "cos", c_math_cos )
269 METHOD( "cosh", c_math_cosh )
270 METHOD( "erf", c_math_erf )
271 METHOD( "erfc", c_math_erfc )
272 METHOD( "exp", c_math_exp )
273 METHOD( "hypot", c_math_hypot )
274 METHOD( "ldexp", c_math_ldexp )
275 METHOD( "log", c_math_log )
276 METHOD( "log10", c_math_log10 )
277 METHOD( "log2", c_math_log2 )
278 METHOD( "sin", c_math_sin )
279 METHOD( "sinh", c_math_sinh )
280 METHOD( "sqrt", c_math_sqrt )
281 METHOD( "tan", c_math_tan )
282 METHOD( "tanh", c_math_tanh )
283*/
284#include "_autogen_module_math.h"
285
286#endif // MRBC_USE_FLOAT && MRBC_USE_MATH
#define mrbc_type(o)
Definition boxing_no.h:57
#define mrbc_float_value(vm, n)
Definition boxing_no.h:65
struct RObject mrbc_value
Value object. Default version.
static double to_double(mrbc_vm *vm, const mrbc_value *v)
Definition c_math.c:37
void mrbc_init_module_math(void)
Definition c_math.c:246
#define MRBC_CLASS(cls)
Definition class.h:55
void mrbc_raise(struct VM *vm, struct RClass *exc_cls, const char *msg)
Definition error.c:145
int mrbc_set_class_const(const mrbc_class *cls, mrbc_sym sym_id, mrbc_value *v)
Definition global.c:75
Include at once the necessary header files.
mrbc_float_t d
Definition boxing_no.h:24
mrbc_int_t i
Definition boxing_no.h:22
#define MRBC_SYM(sym)
Definition symbol.h:31
@ MRBC_TT_FLOAT
Float.
Definition value.h:88
@ MRBC_TT_INTEGER
Integer.
Definition value.h:86
struct VM mrbc_vm
Virtual Machine.
Global configuration of mruby/c VM's.