Browse Source

Merge branch 'master' into math_docs

Marco Bambini 8 years ago
parent
commit
12060a317d
4 changed files with 50 additions and 2 deletions
  1. 2 1
      docs/math.html
  2. 35 0
      src/optionals/gravity_math.c
  3. 1 1
      src/runtime/gravity_core.c
  4. 12 0
      test/unittest/math/xrt.gravity

+ 2 - 1
docs/math.html

@@ -3,7 +3,7 @@
 	<head>
 		<meta charset="utf-8">
 		<meta name="viewport" content="width=device-width, initial-scale=1">
-		<title>Gravity: System</title>
+		<title>Gravity: Math</title>
 		<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/normalize/5.0.0/normalize.min.css" />
 		<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
 		<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:400,700,800">
@@ -133,6 +133,7 @@
 
 	Math.sqrt(9); // 3
 	Math.cbrt(8); // 2
+	Math.xrt(4,16); // 2 (4th root of 16)
 							</code></pre>
 
 							<h4 class="section-h4">Logarithms</h4>

+ 35 - 0
src/optionals/gravity_math.c

@@ -214,6 +214,40 @@ static bool math_cbrt (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, ui
     RETURN_VALUE(VALUE_FROM_UNDEFINED, rindex);
 }
 
+static bool math_xrt (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uint32_t rindex) {
+    if (nargs != 3) RETURN_VALUE(VALUE_FROM_UNDEFINED, rindex);
+
+    gravity_value_t base = GET_VALUE(1);
+    gravity_value_t value = GET_VALUE(2);
+
+    if (VALUE_ISA_NULL(value) || VALUE_ISA_NULL(base)) {
+        RETURN_VALUE(VALUE_FROM_INT(0), rindex);
+    }
+
+    if (VALUE_ISA_INT(value) && VALUE_ISA_INT(base)) {
+        gravity_float_t computed_value = (gravity_float_t)pow((gravity_float_t)value.n, 1.0/base.n);
+        RETURN_VALUE(VALUE_FROM_FLOAT(computed_value), rindex);
+    }
+
+    if (VALUE_ISA_INT(value) && VALUE_ISA_FLOAT(base)) {
+        gravity_float_t computed_value = (gravity_float_t)pow((gravity_float_t)value.n, 1.0/base.f);
+        RETURN_VALUE(VALUE_FROM_FLOAT(computed_value), rindex);
+    }
+
+    if (VALUE_ISA_FLOAT(value) && VALUE_ISA_INT(base)) {
+        gravity_float_t computed_value = (gravity_float_t)pow((gravity_float_t)value.f, 1.0/base.n);
+        RETURN_VALUE(VALUE_FROM_FLOAT(computed_value), rindex);
+    }
+
+    if (VALUE_ISA_FLOAT(value) && VALUE_ISA_INT(base)) {
+        gravity_float_t computed_value = (gravity_float_t)pow((gravity_float_t)value.f, 1.0/base.f);
+        RETURN_VALUE(VALUE_FROM_FLOAT(computed_value), rindex);
+    }
+
+    // should be NaN
+    RETURN_VALUE(VALUE_FROM_UNDEFINED, rindex);
+}
+
 // returns x, rounded upwards to the nearest integer
 static bool math_ceil (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uint32_t rindex) {
     #pragma unused(vm, nargs)
@@ -673,6 +707,7 @@ static void create_optional_class (void) {
     gravity_class_bind(meta, "atan", NEW_CLOSURE_VALUE(math_atan));
     gravity_class_bind(meta, "atan2", NEW_CLOSURE_VALUE(math_atan2));
     gravity_class_bind(meta, "cbrt", NEW_CLOSURE_VALUE(math_cbrt));
+    gravity_class_bind(meta, "xrt", NEW_CLOSURE_VALUE(math_xrt));
     gravity_class_bind(meta, "ceil", NEW_CLOSURE_VALUE(math_ceil));
     gravity_class_bind(meta, "cos", NEW_CLOSURE_VALUE(math_cos));
     gravity_class_bind(meta, "exp", NEW_CLOSURE_VALUE(math_exp));

+ 1 - 1
src/runtime/gravity_core.c

@@ -965,7 +965,7 @@ static bool list_join (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, ui
             // sanity check
             if (to_alloc > MAX_MEMORY_BLOCK) {
                 mem_free(_buffer);
-                RETURN_ERROR("Maximum memory block size reached (max %d, requested %ld).", MAX_MEMORY_BLOCK, to_alloc);
+                RETURN_ERROR("Maximum memory block size reached (max %d, requested %llu).", MAX_MEMORY_BLOCK, to_alloc);
             }
             
 			_buffer = mem_realloc(_buffer, (uint32_t)to_alloc);

+ 12 - 0
test/unittest/math/xrt.gravity

@@ -0,0 +1,12 @@
+#unittest {
+	name: "Test Math.xrt()";
+	error: NONE;
+	result: true;
+};
+
+func main() {
+	var r1 = Math.xrt(4, 16) == 2
+	var r2 = Math.xrt(3, 8) == 2
+	var r3 = Math.xrt(2, 9) == 3
+	return r1 and r2 and r3
+}