From 09bcf5ad9854b38edc69aba748d3f4e6f3340016 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorbj=C3=B8rn=20Lindeijer?= Date: Sat, 14 Mar 2015 14:40:23 +0100 Subject: [PATCH 1/4] Added Num.tan Strange omission with Num.sin and Num.cos already available. --- doc/site/core/num.markdown | 4 ++++ src/vm/wren_core.c | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/doc/site/core/num.markdown b/doc/site/core/num.markdown index a3f93bc5..42d0b415 100644 --- a/doc/site/core/num.markdown +++ b/doc/site/core/num.markdown @@ -42,6 +42,10 @@ The sine of the number. The square root of the number. Returns `nan` if the number is negative. +### **tan** + +The tangent of the number. + ### **-** operator Negates the number. diff --git a/src/vm/wren_core.c b/src/vm/wren_core.c index 32b9e23b..b5ee383b 100644 --- a/src/vm/wren_core.c +++ b/src/vm/wren_core.c @@ -962,6 +962,11 @@ DEF_PRIMITIVE(num_sqrt) RETURN_NUM(sqrt(AS_NUM(args[0]))); } +DEF_PRIMITIVE(num_tan) +{ + RETURN_NUM(tan(AS_NUM(args[0]))); +} + DEF_PRIMITIVE(num_toString) { double value = AS_NUM(args[0]); @@ -1594,6 +1599,7 @@ void wrenInitializeCore(WrenVM* vm) PRIMITIVE(vm->numClass, "sign", num_sign); PRIMITIVE(vm->numClass, "sin", num_sin); PRIMITIVE(vm->numClass, "sqrt", num_sqrt); + PRIMITIVE(vm->numClass, "tan", num_tan); PRIMITIVE(vm->numClass, "toString", num_toString); PRIMITIVE(vm->numClass, "truncate", num_truncate); From 42dd7cdad4e273318cb4b57f459593417d4ee72a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorbj=C3=B8rn=20Lindeijer?= Date: Sat, 14 Mar 2015 14:52:16 +0100 Subject: [PATCH 2/4] Added more goniometry Num methods Num.acos Num.asin Num.atan --- doc/site/core/num.markdown | 12 ++++++++++++ src/vm/wren_core.c | 18 ++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/doc/site/core/num.markdown b/doc/site/core/num.markdown index 42d0b415..f3c10818 100644 --- a/doc/site/core/num.markdown +++ b/doc/site/core/num.markdown @@ -8,6 +8,18 @@ The absolute value of the number. :::dart -123.abs // 123 +### **acos** + +The arc cosine of the number. + +### **asin** + +The arc sine of the number. + +### **atan** + +The arc tangent of the number. + ### **ceil** Rounds the number up to the nearest integer. diff --git a/src/vm/wren_core.c b/src/vm/wren_core.c index b5ee383b..5ace3893 100644 --- a/src/vm/wren_core.c +++ b/src/vm/wren_core.c @@ -909,6 +909,21 @@ DEF_PRIMITIVE(num_abs) RETURN_NUM(fabs(AS_NUM(args[0]))); } +DEF_PRIMITIVE(num_acos) +{ + RETURN_NUM(acos(AS_NUM(args[0]))); +} + +DEF_PRIMITIVE(num_asin) +{ + RETURN_NUM(asin(AS_NUM(args[0]))); +} + +DEF_PRIMITIVE(num_atan) +{ + RETURN_NUM(atan(AS_NUM(args[0]))); +} + DEF_PRIMITIVE(num_ceil) { RETURN_NUM(ceil(AS_NUM(args[0]))); @@ -1591,6 +1606,9 @@ void wrenInitializeCore(WrenVM* vm) PRIMITIVE(vm->numClass, "..(_)", num_dotDot); PRIMITIVE(vm->numClass, "...(_)", num_dotDotDot); PRIMITIVE(vm->numClass, "abs", num_abs); + PRIMITIVE(vm->numClass, "acos", num_acos); + PRIMITIVE(vm->numClass, "asin", num_asin); + PRIMITIVE(vm->numClass, "atan", num_atan); PRIMITIVE(vm->numClass, "ceil", num_ceil); PRIMITIVE(vm->numClass, "cos", num_cos); PRIMITIVE(vm->numClass, "floor", num_floor); From 1099c75c775f1d1ba4cf58e84cd9a4726258fc93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorbj=C3=B8rn=20Lindeijer?= Date: Sun, 15 Mar 2015 16:43:02 +0100 Subject: [PATCH 3/4] Added Num.atan(x) Maps to the C function atan2. --- doc/site/core/num.markdown | 5 +++++ src/vm/wren_core.c | 8 +++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/doc/site/core/num.markdown b/doc/site/core/num.markdown index f3c10818..e3d314ed 100644 --- a/doc/site/core/num.markdown +++ b/doc/site/core/num.markdown @@ -20,6 +20,11 @@ The arc sine of the number. The arc tangent of the number. +### **atan**(x) + +The arc tangent of the number when divided by `x`, using the signs of the two +numbers to determine the quadrant of the result. + ### **ceil** Rounds the number up to the nearest integer. diff --git a/src/vm/wren_core.c b/src/vm/wren_core.c index 5ace3893..f3a8687c 100644 --- a/src/vm/wren_core.c +++ b/src/vm/wren_core.c @@ -380,7 +380,7 @@ DEF_PRIMITIVE(class_supertype) // Object has no superclass. if (classObj->superclass == NULL) RETURN_NULL; - + RETURN_OBJ(classObj->superclass); } @@ -924,6 +924,11 @@ DEF_PRIMITIVE(num_atan) RETURN_NUM(atan(AS_NUM(args[0]))); } +DEF_PRIMITIVE(num_atan2) +{ + RETURN_NUM(atan2(AS_NUM(args[0]), AS_NUM(args[1]))); +} + DEF_PRIMITIVE(num_ceil) { RETURN_NUM(ceil(AS_NUM(args[0]))); @@ -1609,6 +1614,7 @@ void wrenInitializeCore(WrenVM* vm) PRIMITIVE(vm->numClass, "acos", num_acos); PRIMITIVE(vm->numClass, "asin", num_asin); PRIMITIVE(vm->numClass, "atan", num_atan); + PRIMITIVE(vm->numClass, "atan(_)", num_atan2); PRIMITIVE(vm->numClass, "ceil", num_ceil); PRIMITIVE(vm->numClass, "cos", num_cos); PRIMITIVE(vm->numClass, "floor", num_floor); From 07951bbeae24d1c1064423273a03fb0a63ba98ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorbj=C3=B8rn=20Lindeijer?= Date: Thu, 19 Mar 2015 21:12:50 +0100 Subject: [PATCH 4/4] Added Num.pi and some tests --- doc/site/core/num.markdown | 3 +++ src/vm/wren_core.c | 6 ++++++ test/core/number/acos.wren | 3 +++ test/core/number/asin.wren | 3 +++ test/core/number/atan.wren | 2 ++ test/core/number/atan2.wren | 4 ++++ test/core/number/cos.wren | 6 ++++++ test/core/number/sin.wren | 6 ++++++ test/core/number/tan.wren | 3 +++ 9 files changed, 36 insertions(+) create mode 100644 test/core/number/acos.wren create mode 100644 test/core/number/asin.wren create mode 100644 test/core/number/atan.wren create mode 100644 test/core/number/atan2.wren create mode 100644 test/core/number/cos.wren create mode 100644 test/core/number/sin.wren create mode 100644 test/core/number/tan.wren diff --git a/doc/site/core/num.markdown b/doc/site/core/num.markdown index e3d314ed..42504c4d 100644 --- a/doc/site/core/num.markdown +++ b/doc/site/core/num.markdown @@ -139,3 +139,6 @@ Attempts to parse `value` as a decimal literal and return it as an instance of It is a runtime error if `value` is not a string. +### Num.**pi** + +The value of π. diff --git a/src/vm/wren_core.c b/src/vm/wren_core.c index f3a8687c..ea3ed406 100644 --- a/src/vm/wren_core.c +++ b/src/vm/wren_core.c @@ -1060,6 +1060,11 @@ DEF_PRIMITIVE(num_negate) RETURN_NUM(-AS_NUM(args[0])); } +DEF_PRIMITIVE(num_pi) +{ + RETURN_NUM(3.14159265358979323846); +} + DEF_PRIMITIVE(num_minus) { if (!validateNum(vm, args, 1, "Right operand")) return PRIM_ERROR; @@ -1592,6 +1597,7 @@ void wrenInitializeCore(WrenVM* vm) vm->numClass = defineClass(vm, "Num"); PRIMITIVE(vm->numClass->obj.classObj, "fromString(_)", num_fromString); + PRIMITIVE(vm->numClass->obj.classObj, "pi", num_pi); PRIMITIVE(vm->numClass, "-", num_negate); PRIMITIVE(vm->numClass, "-(_)", num_minus); PRIMITIVE(vm->numClass, "+(_)", num_plus); diff --git a/test/core/number/acos.wren b/test/core/number/acos.wren new file mode 100644 index 00000000..54d54da9 --- /dev/null +++ b/test/core/number/acos.wren @@ -0,0 +1,3 @@ +IO.print(0.acos) // expect: 1.5707963267949 +IO.print(1.acos) // expect: 0 +IO.print((-1).acos) // expect: 3.1415926535898 diff --git a/test/core/number/asin.wren b/test/core/number/asin.wren new file mode 100644 index 00000000..e6c312af --- /dev/null +++ b/test/core/number/asin.wren @@ -0,0 +1,3 @@ +IO.print(0.asin) // expect: 0 +IO.print(1.asin) // expect: 1.5707963267949 +IO.print((-1).asin) // expect: -1.5707963267949 diff --git a/test/core/number/atan.wren b/test/core/number/atan.wren new file mode 100644 index 00000000..822315d7 --- /dev/null +++ b/test/core/number/atan.wren @@ -0,0 +1,2 @@ +IO.print(0.atan) // expect: 0 +IO.print(1.atan) // expect: 0.78539816339745 diff --git a/test/core/number/atan2.wren b/test/core/number/atan2.wren new file mode 100644 index 00000000..e1f5289f --- /dev/null +++ b/test/core/number/atan2.wren @@ -0,0 +1,4 @@ +IO.print(0.atan(0)) // expect: 0 +IO.print(0.atan(1)) // expect: 0 + +IO.print(1.atan(0)) // expect: 1.5707963267949 diff --git a/test/core/number/cos.wren b/test/core/number/cos.wren new file mode 100644 index 00000000..b7be49af --- /dev/null +++ b/test/core/number/cos.wren @@ -0,0 +1,6 @@ +IO.print(0.cos) // expect: 1 +IO.print(Num.pi.cos) // expect: -1 +IO.print((2 * Num.pi).cos) // expect: 1 + +// this should of course be 0, but it's not that precise +IO.print((Num.pi / 2).cos) // expect: 6.1232339957368e-17 diff --git a/test/core/number/sin.wren b/test/core/number/sin.wren new file mode 100644 index 00000000..da2218e9 --- /dev/null +++ b/test/core/number/sin.wren @@ -0,0 +1,6 @@ +IO.print(0.sin) // expect: 0 +IO.print((Num.pi / 2).sin) // expect: 1 + +// these should of course be 0, but it's not that precise +IO.print(Num.pi.sin) // expect: 1.2246467991474e-16 +IO.print((2 * Num.pi).sin) // expect: -2.4492935982947e-16 diff --git a/test/core/number/tan.wren b/test/core/number/tan.wren new file mode 100644 index 00000000..7173db4b --- /dev/null +++ b/test/core/number/tan.wren @@ -0,0 +1,3 @@ +IO.print(0.tan) // expect: 0 +IO.print((Num.pi / 4).tan) // expect: 1 +IO.print((-Num.pi / 4).tan) // expect: -1