summaryrefslogtreecommitdiff
path: root/examples/natmod/features2/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'examples/natmod/features2/main.c')
-rw-r--r--examples/natmod/features2/main.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/examples/natmod/features2/main.c b/examples/natmod/features2/main.c
index 22961aa49..5ce8e7b01 100644
--- a/examples/natmod/features2/main.c
+++ b/examples/natmod/features2/main.c
@@ -1,5 +1,6 @@
/* This example demonstrates the following features in a native module:
- using floats
+ - calling math functions from libm.a
- defining additional code in Python (see test.py)
- have extra C code in a separate file (see prod.c)
*/
@@ -10,6 +11,9 @@
// Include the header for auxiliary C code for this module
#include "prod.h"
+// Include standard library header
+#include <math.h>
+
// Automatically detect if this module should include double-precision code.
// If double precision is supported by the target architecture then it can
// be used in native module regardless of what float setting the target
@@ -41,6 +45,12 @@ static mp_obj_t add_d(mp_obj_t x, mp_obj_t y) {
static MP_DEFINE_CONST_FUN_OBJ_2(add_d_obj, add_d);
#endif
+// A function that uses libm
+static mp_obj_t call_round(mp_obj_t x) {
+ return mp_obj_new_float_from_f(roundf(mp_obj_get_float_to_f(x)));
+}
+static MP_DEFINE_CONST_FUN_OBJ_1(round_obj, call_round);
+
// A function that computes the product of floats in an array.
// This function uses the most general C argument interface, which is more difficult
// to use but has access to the globals dict of the module via self->globals.
@@ -74,6 +84,7 @@ mp_obj_t mpy_init(mp_obj_fun_bc_t *self, size_t n_args, size_t n_kw, mp_obj_t *a
#if USE_DOUBLE
mp_store_global(MP_QSTR_add_d, MP_OBJ_FROM_PTR(&add_d_obj));
#endif
+ mp_store_global(MP_QSTR_round, MP_OBJ_FROM_PTR(&round_obj));
// The productf function uses the most general C argument interface
mp_store_global(MP_QSTR_productf, MP_DYNRUNTIME_MAKE_FUNCTION(productf));