[njs] More Math methods from ES6.
Valentin Bartenev
vbart at nginx.com
Fri Nov 18 14:27:20 UTC 2016
details: http://hg.nginx.org/njs/rev/4f4bda866d8e
branches:
changeset: 262:4f4bda866d8e
user: Valentin Bartenev <vbart at nginx.com>
date: Fri Nov 18 17:25:25 2016 +0300
description:
More Math methods from ES6.
diffstat:
njs/njs_math.c | 333 +++++++++++++++++++++++++++++++++++++++++++++++
njs/test/njs_unit_test.c | 292 +++++++++++++++++++++++++++++++++++++++++
2 files changed, 625 insertions(+), 0 deletions(-)
diffs (820 lines):
diff -r f402a8c64d7a -r 4f4bda866d8e njs/njs_math.c
--- a/njs/njs_math.c Wed Nov 16 15:21:07 2016 +0300
+++ b/njs/njs_math.c Fri Nov 18 17:25:25 2016 +0300
@@ -69,6 +69,25 @@ njs_object_math_acos(njs_vm_t *vm, njs_v
static njs_ret_t
+njs_object_math_acosh(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
+{
+ double num;
+
+ if (nargs > 1) {
+ num = acosh(args[1].data.u.number);
+
+ } else {
+ num = NAN;
+ }
+
+ njs_number_set(&vm->retval, num);
+
+ return NXT_OK;
+}
+
+
+static njs_ret_t
njs_object_math_asin(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
njs_index_t unused)
{
@@ -97,6 +116,25 @@ njs_object_math_asin(njs_vm_t *vm, njs_v
static njs_ret_t
+njs_object_math_asinh(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
+{
+ double num;
+
+ if (nargs > 1) {
+ num = asinh(args[1].data.u.number);
+
+ } else {
+ num = NAN;
+ }
+
+ njs_number_set(&vm->retval, num);
+
+ return NXT_OK;
+}
+
+
+static njs_ret_t
njs_object_math_atan(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
njs_index_t unused)
{
@@ -138,6 +176,44 @@ njs_object_math_atan2(njs_vm_t *vm, njs_
static njs_ret_t
+njs_object_math_atanh(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
+{
+ double num;
+
+ if (nargs > 1) {
+ num = atanh(args[1].data.u.number);
+
+ } else {
+ num = NAN;
+ }
+
+ njs_number_set(&vm->retval, num);
+
+ return NXT_OK;
+}
+
+
+static njs_ret_t
+njs_object_math_cbrt(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
+{
+ double num;
+
+ if (nargs > 1) {
+ num = cbrt(args[1].data.u.number);
+
+ } else {
+ num = NAN;
+ }
+
+ njs_number_set(&vm->retval, num);
+
+ return NXT_OK;
+}
+
+
+static njs_ret_t
njs_object_math_ceil(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
njs_index_t unused)
{
@@ -176,6 +252,25 @@ njs_object_math_cos(njs_vm_t *vm, njs_va
static njs_ret_t
+njs_object_math_cosh(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
+{
+ double num;
+
+ if (nargs > 1) {
+ num = cosh(args[1].data.u.number);
+
+ } else {
+ num = NAN;
+ }
+
+ njs_number_set(&vm->retval, num);
+
+ return NXT_OK;
+}
+
+
+static njs_ret_t
njs_object_math_exp(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
njs_index_t unused)
{
@@ -195,6 +290,25 @@ njs_object_math_exp(njs_vm_t *vm, njs_va
static njs_ret_t
+njs_object_math_expm1(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
+{
+ double num;
+
+ if (nargs > 1) {
+ num = expm1(args[1].data.u.number);
+
+ } else {
+ num = NAN;
+ }
+
+ njs_number_set(&vm->retval, num);
+
+ return NXT_OK;
+}
+
+
+static njs_ret_t
njs_object_math_floor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
njs_index_t unused)
{
@@ -214,6 +328,25 @@ njs_object_math_floor(njs_vm_t *vm, njs_
static njs_ret_t
+njs_object_math_fround(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
+{
+ double num;
+
+ if (nargs > 1) {
+ num = (float) args[1].data.u.number;
+
+ } else {
+ num = NAN;
+ }
+
+ njs_number_set(&vm->retval, num);
+
+ return NXT_OK;
+}
+
+
+static njs_ret_t
njs_object_math_hypot(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
njs_index_t unused)
{
@@ -264,6 +397,72 @@ njs_object_math_log(njs_vm_t *vm, njs_va
static njs_ret_t
+njs_object_math_log10(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
+{
+ double num;
+
+ if (nargs > 1) {
+ num = log10(args[1].data.u.number);
+
+ } else {
+ num = NAN;
+ }
+
+ njs_number_set(&vm->retval, num);
+
+ return NXT_OK;
+}
+
+
+static njs_ret_t
+njs_object_math_log1p(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
+{
+ double num;
+
+ if (nargs > 1) {
+ num = log1p(args[1].data.u.number);
+
+ } else {
+ num = NAN;
+ }
+
+ njs_number_set(&vm->retval, num);
+
+ return NXT_OK;
+}
+
+
+static njs_ret_t
+njs_object_math_log2(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
+{
+ double num;
+
+ if (nargs > 1) {
+ num = args[1].data.u.number;
+
+#if (NXT_SOLARIS)
+ /* On Solaris 10 log(-1) returns -Infinity. */
+ if (num < 0) {
+ num = NAN;
+ }
+#endif
+
+ num = log2(num);
+
+ } else {
+ num = NAN;
+ }
+
+ njs_number_set(&vm->retval, num);
+
+ return NXT_OK;
+}
+
+
+static njs_ret_t
njs_object_math_max(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
njs_index_t unused)
{
@@ -423,6 +622,25 @@ njs_object_math_sin(njs_vm_t *vm, njs_va
static njs_ret_t
+njs_object_math_sinh(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
+{
+ double num;
+
+ if (nargs > 1) {
+ num = sinh(args[1].data.u.number);
+
+ } else {
+ num = NAN;
+ }
+
+ njs_number_set(&vm->retval, num);
+
+ return NXT_OK;
+}
+
+
+static njs_ret_t
njs_object_math_sqrt(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
njs_index_t unused)
{
@@ -461,6 +679,25 @@ njs_object_math_tan(njs_vm_t *vm, njs_va
static njs_ret_t
+njs_object_math_tanh(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
+{
+ double num;
+
+ if (nargs > 1) {
+ num = tanh(args[1].data.u.number);
+
+ } else {
+ num = NAN;
+ }
+
+ njs_number_set(&vm->retval, num);
+
+ return NXT_OK;
+}
+
+
+static njs_ret_t
njs_object_math_trunc(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
njs_index_t unused)
{
@@ -549,6 +786,14 @@ static const njs_object_prop_t njs_math
NJS_SKIP_ARG, NJS_NUMBER_ARG),
},
+ /* ES6. */
+ {
+ .type = NJS_METHOD,
+ .name = njs_string("acosh"),
+ .value = njs_native_function(njs_object_math_acosh, 0,
+ NJS_SKIP_ARG, NJS_NUMBER_ARG),
+ },
+
{
.type = NJS_METHOD,
.name = njs_string("asin"),
@@ -556,6 +801,14 @@ static const njs_object_prop_t njs_math
NJS_SKIP_ARG, NJS_NUMBER_ARG),
},
+ /* ES6. */
+ {
+ .type = NJS_METHOD,
+ .name = njs_string("asinh"),
+ .value = njs_native_function(njs_object_math_asinh, 0,
+ NJS_SKIP_ARG, NJS_NUMBER_ARG),
+ },
+
{
.type = NJS_METHOD,
.name = njs_string("atan"),
@@ -570,6 +823,22 @@ static const njs_object_prop_t njs_math
NJS_SKIP_ARG, NJS_NUMBER_ARG, NJS_NUMBER_ARG),
},
+ /* ES6. */
+ {
+ .type = NJS_METHOD,
+ .name = njs_string("atanh"),
+ .value = njs_native_function(njs_object_math_atanh, 0,
+ NJS_SKIP_ARG, NJS_NUMBER_ARG),
+ },
+
+ /* ES6. */
+ {
+ .type = NJS_METHOD,
+ .name = njs_string("cbrt"),
+ .value = njs_native_function(njs_object_math_cbrt, 0,
+ NJS_SKIP_ARG, NJS_NUMBER_ARG),
+ },
+
{
.type = NJS_METHOD,
.name = njs_string("ceil"),
@@ -584,6 +853,14 @@ static const njs_object_prop_t njs_math
NJS_SKIP_ARG, NJS_NUMBER_ARG),
},
+ /* ES6. */
+ {
+ .type = NJS_METHOD,
+ .name = njs_string("cosh"),
+ .value = njs_native_function(njs_object_math_cosh, 0,
+ NJS_SKIP_ARG, NJS_NUMBER_ARG),
+ },
+
{
.type = NJS_METHOD,
.name = njs_string("exp"),
@@ -591,6 +868,14 @@ static const njs_object_prop_t njs_math
NJS_SKIP_ARG, NJS_NUMBER_ARG),
},
+ /* ES6. */
+ {
+ .type = NJS_METHOD,
+ .name = njs_string("expm1"),
+ .value = njs_native_function(njs_object_math_expm1, 0,
+ NJS_SKIP_ARG, NJS_NUMBER_ARG),
+ },
+
{
.type = NJS_METHOD,
.name = njs_string("floor"),
@@ -601,6 +886,14 @@ static const njs_object_prop_t njs_math
/* ES6. */
{
.type = NJS_METHOD,
+ .name = njs_string("fround"),
+ .value = njs_native_function(njs_object_math_fround, 0,
+ NJS_SKIP_ARG, NJS_NUMBER_ARG),
+ },
+
+ /* ES6. */
+ {
+ .type = NJS_METHOD,
.name = njs_string("hypot"),
.value = njs_native_function(njs_object_math_hypot, 0, 0),
},
@@ -612,6 +905,30 @@ static const njs_object_prop_t njs_math
NJS_SKIP_ARG, NJS_NUMBER_ARG),
},
+ /* ES6. */
+ {
+ .type = NJS_METHOD,
+ .name = njs_string("log10"),
+ .value = njs_native_function(njs_object_math_log10, 0,
+ NJS_SKIP_ARG, NJS_NUMBER_ARG),
+ },
+
+ /* ES6. */
+ {
+ .type = NJS_METHOD,
+ .name = njs_string("log1p"),
+ .value = njs_native_function(njs_object_math_log1p, 0,
+ NJS_SKIP_ARG, NJS_NUMBER_ARG),
+ },
+
+ /* ES6. */
+ {
+ .type = NJS_METHOD,
+ .name = njs_string("log2"),
+ .value = njs_native_function(njs_object_math_log2, 0,
+ NJS_SKIP_ARG, NJS_NUMBER_ARG),
+ },
+
{
.type = NJS_METHOD,
.name = njs_string("max"),
@@ -659,6 +976,14 @@ static const njs_object_prop_t njs_math
NJS_SKIP_ARG, NJS_NUMBER_ARG),
},
+ /* ES6. */
+ {
+ .type = NJS_METHOD,
+ .name = njs_string("sinh"),
+ .value = njs_native_function(njs_object_math_sinh, 0,
+ NJS_SKIP_ARG, NJS_NUMBER_ARG),
+ },
+
{
.type = NJS_METHOD,
.name = njs_string("sqrt"),
@@ -676,6 +1001,14 @@ static const njs_object_prop_t njs_math
/* ES6. */
{
.type = NJS_METHOD,
+ .name = njs_string("tanh"),
+ .value = njs_native_function(njs_object_math_tanh, 0,
+ NJS_SKIP_ARG, NJS_NUMBER_ARG),
+ },
+
+ /* ES6. */
+ {
+ .type = NJS_METHOD,
.name = njs_string("trunc"),
.value = njs_native_function(njs_object_math_trunc, 0,
NJS_SKIP_ARG, NJS_NUMBER_ARG),
diff -r f402a8c64d7a -r 4f4bda866d8e njs/test/njs_unit_test.c
--- a/njs/test/njs_unit_test.c Wed Nov 16 15:21:07 2016 +0300
+++ b/njs/test/njs_unit_test.c Fri Nov 18 17:25:25 2016 +0300
@@ -5549,6 +5549,29 @@ static njs_unit_test_t njs_test[] =
{ nxt_string("Math.acos(0) - Math.PI/2"),
nxt_string("0") },
+ { nxt_string("Math.acosh()"),
+ nxt_string("NaN") },
+
+ { nxt_string("Math.acosh('abc')"),
+ nxt_string("NaN") },
+
+ { nxt_string("Math.acosh(0.9)"),
+ nxt_string("NaN") },
+
+ { nxt_string("Math.acosh(1)"),
+ nxt_string("0") },
+
+ { nxt_string("Math.acosh('Infinity')"),
+ nxt_string("Infinity") },
+
+ /*
+ * The difference is 2 * Number.EPSILON on FreeBSD
+ * and zero on other platforms.
+ */
+ { nxt_string("Math.abs(Math.cosh(1) - (1/Math.E + Math.E)/2)"
+ " <= 2 * Number.EPSILON"),
+ nxt_string("true") },
+
{ nxt_string("Math.asin()"),
nxt_string("NaN") },
@@ -5573,6 +5596,27 @@ static njs_unit_test_t njs_test[] =
{ nxt_string("Math.asin(1) - Math.PI/2"),
nxt_string("0") },
+ { nxt_string("Math.asinh()"),
+ nxt_string("NaN") },
+
+ { nxt_string("Math.asinh('abc')"),
+ nxt_string("NaN") },
+
+ { nxt_string("Math.asinh(0)"),
+ nxt_string("0") },
+
+ { nxt_string("Math.asinh('-0')"),
+ nxt_string("-0") },
+
+ { nxt_string("Math.asinh(Infinity)"),
+ nxt_string("Infinity") },
+
+ { nxt_string("Math.asinh(-Infinity)"),
+ nxt_string("-Infinity") },
+
+ { nxt_string("Math.asinh((Math.E - 1/Math.E)/2)"),
+ nxt_string("1") },
+
{ nxt_string("Math.atan()"),
nxt_string("NaN") },
@@ -5675,6 +5719,62 @@ static njs_unit_test_t njs_test[] =
{ nxt_string("Math.atan2(1, 1) - Math.atan2(-5, -5) - Math.PI"),
nxt_string("0") },
+ { nxt_string("Math.atanh()"),
+ nxt_string("NaN") },
+
+ { nxt_string("Math.atanh('abc')"),
+ nxt_string("NaN") },
+
+ { nxt_string("Math.atanh(-1.1)"),
+ nxt_string("NaN") },
+
+ { nxt_string("Math.atanh(1.1)"),
+ nxt_string("NaN") },
+
+ { nxt_string("Math.atanh(1)"),
+ nxt_string("Infinity") },
+
+ { nxt_string("Math.atanh('-1')"),
+ nxt_string("-Infinity") },
+
+ { nxt_string("Math.atanh(0)"),
+ nxt_string("0") },
+
+ { nxt_string("Math.atanh(-0)"),
+ nxt_string("-0") },
+
+ /*
+ * The difference is Number.EPSILON on Linux/i686
+ * and zero on other platforms.
+ */
+ { nxt_string("Math.abs(1 - Math.atanh((Math.E - 1)/(Math.E + 1)) * 2)"
+ " <= Number.EPSILON"),
+ nxt_string("true") },
+
+ { nxt_string("Math.cbrt()"),
+ nxt_string("NaN") },
+
+ { nxt_string("Math.cbrt('abc')"),
+ nxt_string("NaN") },
+
+ { nxt_string("Math.cbrt(0)"),
+ nxt_string("0") },
+
+ { nxt_string("Math.cbrt('-0')"),
+ nxt_string("-0") },
+
+ { nxt_string("Math.cbrt(Infinity)"),
+ nxt_string("Infinity") },
+
+ { nxt_string("Math.cbrt(-Infinity)"),
+ nxt_string("-Infinity") },
+
+ { nxt_string("Math.cbrt('27')"),
+ nxt_string("3") },
+
+ { nxt_string("Math.cbrt(-1)"),
+ nxt_string("-1") },
+
{ nxt_string("Math.ceil()"),
nxt_string("NaN") },
@@ -5720,6 +5820,32 @@ static njs_unit_test_t njs_test[] =
{ nxt_string("Math.cos(Math.PI*2)"),
nxt_string("1") },
+ { nxt_string("Math.cosh()"),
+ nxt_string("NaN") },
+
+ { nxt_string("Math.cosh('abc')"),
+ nxt_string("NaN") },
+
+ { nxt_string("Math.cosh('0')"),
+ nxt_string("1") },
+
+ { nxt_string("Math.cosh(-0)"),
+ nxt_string("1") },
+
+ { nxt_string("Math.cosh(Infinity)"),
+ nxt_string("Infinity") },
+
+ { nxt_string("Math.cosh(-Infinity)"),
+ nxt_string("Infinity") },
+
+ /*
+ * The difference is Number.EPSILON on FreeBSD
+ * and zero on other platforms.
+ */
+ { nxt_string("Math.abs(Math.cosh(1) - (1/Math.E + Math.E)/2)"
+ " <= Number.EPSILON"),
+ nxt_string("true") },
+
{ nxt_string("Math.exp()"),
nxt_string("NaN") },
@@ -5745,6 +5871,31 @@ static njs_unit_test_t njs_test[] =
{ nxt_string("Math.exp(1) - Math.E <= 2 * Number.EPSILON"),
nxt_string("true") },
+ { nxt_string("Math.expm1()"),
+ nxt_string("NaN") },
+
+ { nxt_string("Math.expm1('abc')"),
+ nxt_string("NaN") },
+
+ { nxt_string("Math.expm1('0')"),
+ nxt_string("0") },
+
+ { nxt_string("Math.expm1(-0)"),
+ nxt_string("-0") },
+
+ { nxt_string("Math.expm1(Infinity)"),
+ nxt_string("Infinity") },
+
+ { nxt_string("Math.expm1(-Infinity)"),
+ nxt_string("-1") },
+
+ /*
+ * The difference is 2 * Number.EPSILON on FreeBSD, Solaris,
+ * and MacOSX and zero on other platforms.
+ */
+ { nxt_string("Math.abs(1 + Math.expm1(1) - Math.E) <= 2 * Number.EPSILON"),
+ nxt_string("true") },
+
{ nxt_string("Math.floor()"),
nxt_string("NaN") },
@@ -5769,6 +5920,33 @@ static njs_unit_test_t njs_test[] =
{ nxt_string("Math.floor(-3.1)"),
nxt_string("-4") },
+ { nxt_string("Math.fround()"),
+ nxt_string("NaN") },
+
+ { nxt_string("Math.fround('abc')"),
+ nxt_string("NaN") },
+
+ { nxt_string("Math.fround(0)"),
+ nxt_string("0") },
+
+ { nxt_string("Math.fround('-0')"),
+ nxt_string("-0") },
+
+ { nxt_string("Math.fround('Infinity')"),
+ nxt_string("Infinity") },
+
+ { nxt_string("Math.fround(-Infinity)"),
+ nxt_string("-Infinity") },
+
+ { nxt_string("Math.fround('-1.5')"),
+ nxt_string("-1.5") },
+
+ { nxt_string("Math.fround(16777216)"),
+ nxt_string("16777216") },
+
+ { nxt_string("Math.fround(-16777217)"),
+ nxt_string("-16777216") },
+
{ nxt_string("Math.hypot()"),
nxt_string("0") },
@@ -5814,6 +5992,78 @@ static njs_unit_test_t njs_test[] =
{ nxt_string("Math.log(Math.E)"),
nxt_string("1") },
+ { nxt_string("Math.log10()"),
+ nxt_string("NaN") },
+
+ { nxt_string("Math.log10('abc')"),
+ nxt_string("NaN") },
+
+ { nxt_string("Math.log10(-1)"),
+ nxt_string("NaN") },
+
+ { nxt_string("Math.log10(0)"),
+ nxt_string("-Infinity") },
+
+ { nxt_string("Math.log10('-0')"),
+ nxt_string("-Infinity") },
+
+ { nxt_string("Math.log10(1)"),
+ nxt_string("0") },
+
+ { nxt_string("Math.log10(Infinity)"),
+ nxt_string("Infinity") },
+
+ { nxt_string("Math.log10(1000)"),
+ nxt_string("3") },
+
+ { nxt_string("Math.log1p()"),
+ nxt_string("NaN") },
+
+ { nxt_string("Math.log1p('abc')"),
+ nxt_string("NaN") },
+
+ { nxt_string("Math.log1p(-2)"),
+ nxt_string("NaN") },
+
+ { nxt_string("Math.log1p('-1')"),
+ nxt_string("-Infinity") },
+
+ { nxt_string("Math.log1p(0)"),
+ nxt_string("0") },
+
+ { nxt_string("Math.log1p(-0)"),
+ nxt_string("-0") },
+
+ { nxt_string("Math.log1p(Infinity)"),
+ nxt_string("Infinity") },
+
+ { nxt_string("Math.log1p(Math.E - 1)"),
+ nxt_string("1") },
+
+ { nxt_string("Math.log2()"),
+ nxt_string("NaN") },
+
+ { nxt_string("Math.log2('abc')"),
+ nxt_string("NaN") },
+
+ { nxt_string("Math.log2(-1)"),
+ nxt_string("NaN") },
+
+ { nxt_string("Math.log2(0)"),
+ nxt_string("-Infinity") },
+
+ { nxt_string("Math.log2('-0')"),
+ nxt_string("-Infinity") },
+
+ { nxt_string("Math.log2(1)"),
+ nxt_string("0") },
+
+ { nxt_string("Math.log2(Infinity)"),
+ nxt_string("Infinity") },
+
+ { nxt_string("Math.log2(128)"),
+ nxt_string("7") },
+
{ nxt_string("Math.max()"),
nxt_string("-Infinity") },
@@ -5919,6 +6169,27 @@ static njs_unit_test_t njs_test[] =
{ nxt_string("Math.sin(-Math.PI/2)"),
nxt_string("-1") },
+ { nxt_string("Math.sinh()"),
+ nxt_string("NaN") },
+
+ { nxt_string("Math.sinh('abc')"),
+ nxt_string("NaN") },
+
+ { nxt_string("Math.sinh('0')"),
+ nxt_string("0") },
+
+ { nxt_string("Math.sinh(-0)"),
+ nxt_string("-0") },
+
+ { nxt_string("Math.sinh(Infinity)"),
+ nxt_string("Infinity") },
+
+ { nxt_string("Math.sinh(-Infinity)"),
+ nxt_string("-Infinity") },
+
+ { nxt_string("Math.sinh(1) - (Math.E - 1/Math.E)/2"),
+ nxt_string("0") },
+
{ nxt_string("Math.sqrt()"),
nxt_string("NaN") },
@@ -5961,6 +6232,27 @@ static njs_unit_test_t njs_test[] =
{ nxt_string("Math.tan(Math.PI/3) + Math.tan(-Math.PI/3)"),
nxt_string("0") },
+ { nxt_string("Math.tanh()"),
+ nxt_string("NaN") },
+
+ { nxt_string("Math.tanh('abc')"),
+ nxt_string("NaN") },
+
+ { nxt_string("Math.tanh('0')"),
+ nxt_string("0") },
+
+ { nxt_string("Math.tanh(-0)"),
+ nxt_string("-0") },
+
+ { nxt_string("Math.tanh(Infinity)"),
+ nxt_string("1") },
+
+ { nxt_string("Math.tanh(-Infinity)"),
+ nxt_string("-1") },
+
+ { nxt_string("Math.tanh(0.5) - (Math.E - 1)/(Math.E + 1)"),
+ nxt_string("0") },
+
{ nxt_string("Math.trunc(3.9)"),
nxt_string("3") },
More information about the nginx-devel
mailing list