diff --git a/docs/configuration.md b/docs/configuration.md index ec47dfea4..49f044228 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -12,7 +12,7 @@ configure math.js: The following configuration options are available: - `epsilon`. The minimum relative difference used to test equality between two - compared values. This value is used by all comparison functions. + compared values. This value is used by all relational functions. Default value is `1e-14`. - `matrix`. The default type of matrix output for functions. diff --git a/docs/datatypes/numbers.md b/docs/datatypes/numbers.md index 04dbb042b..18a086995 100644 --- a/docs/datatypes/numbers.md +++ b/docs/datatypes/numbers.md @@ -58,14 +58,14 @@ console.log(1e309); // Infinity console.log(1e-324); // 0 ``` -## Comparison +## Equality Because of rounding errors in calculations, it is unsafe to compare JavaScript Numbers. For example executing `0.1 + 0.2 == 0.3` in JavaScript will return false, as the addition `0.1 + 0.2` introduces a round-off error and does not return exactly `0.3`. -To solve this problem, the comparison functions of math.js check whether the +To solve this problem, the relational functions of math.js check whether the relative difference between the compared values is smaller than the configured option `epsilon`. In pseudo code (without exceptions for 0, Infinity and NaN): @@ -80,7 +80,7 @@ where: `1.0 + DBL_EPSILON != 1.0`. This is a constant with a value of approximately `2.2204460492503130808472633361816e-16`; -Note that the comparison functions cannot be used to compare small values +Note that the relational functions cannot be used to compare small values (`< 2.22e-16`). These values are all considered equal to zero. Examples: @@ -95,5 +95,5 @@ console.log(3e-20 == 3.1e-20); // false console.log(math.equal(3e-20, 3.1e-20)); // true ``` -The available comparison functions are: `compare`, `equal`, `larger`, +The available relational functions are: `compare`, `equal`, `larger`, `largerEq`, `smaller`, `smallerEq`, `unequal`. diff --git a/docs/expressions.md b/docs/expressions.md index 26260f7de..56afa1c25 100644 --- a/docs/expressions.md +++ b/docs/expressions.md @@ -305,7 +305,7 @@ Operators | Description `x unit` | Unit `*`, `/`, `.*`, `./`, `%`, `mod` | Multiply, divide, modulus, implicit multiply `+`, `-` | Add, subtract -`==`, `!=`, `<`, `>`, `<=`, `>=` | Comparison +`==`, `!=`, `<`, `>`, `<=`, `>=` | Relational `to`, `in` | Unit conversion `:` | Range `?`, `:` | Conditional expression diff --git a/docs/reference/functions/categorical.md b/docs/reference/functions/categorical.md index 622b1493f..023590a71 100644 --- a/docs/reference/functions/categorical.md +++ b/docs/reference/functions/categorical.md @@ -30,17 +30,6 @@ - [unaryPlus(x)](unaryPlus.md) - [xgcd(a, b)](xgcd.md) -## comparison - -- [compare(x, y)](compare.md) -- [deepEqual(x, y)](deepEqual.md) -- [equal(x, y)](equal.md) -- [larger(x, y)](larger.md) -- [largerEq(x, y)](largerEq.md) -- [smaller(x, y)](smaller.md) -- [smallerEq(x, y)](smallerEq.md) -- [unequal(x, y)](unequal.md) - ## complex - [arg(x)](arg.md) @@ -94,6 +83,17 @@ - [random([min, max])](random.md) - [randomInt([min, max])](randomInt.md) +## relational + +- [compare(x, y)](compare.md) +- [deepEqual(x, y)](deepEqual.md) +- [equal(x, y)](equal.md) +- [larger(x, y)](larger.md) +- [largerEq(x, y)](largerEq.md) +- [smaller(x, y)](smaller.md) +- [smallerEq(x, y)](smallerEq.md) +- [unequal(x, y)](unequal.md) + ## statistics - [max(a, b, c, ...)](max.md) diff --git a/docs/reference/functions/format.md b/docs/reference/functions/format.md index 05dccd499..13cd0935e 100644 --- a/docs/reference/functions/format.md +++ b/docs/reference/functions/format.md @@ -58,7 +58,7 @@ Parameter | Type | Description Type | Description ---- | ----------- -String | str The formatted value +String | The formatted value ## Examples diff --git a/lib/expression/docs/function/comparison/compare.js b/lib/expression/docs/function/relational/compare.js similarity index 93% rename from lib/expression/docs/function/comparison/compare.js rename to lib/expression/docs/function/relational/compare.js index 68de08114..8e0ca8cab 100644 --- a/lib/expression/docs/function/comparison/compare.js +++ b/lib/expression/docs/function/relational/compare.js @@ -1,6 +1,6 @@ module.exports = { 'name': 'compare', - 'category': 'Comparison', + 'category': 'Relational', 'syntax': [ 'compare(x, y)' ], diff --git a/lib/expression/docs/function/comparison/deepEqual.js b/lib/expression/docs/function/relational/deepEqual.js similarity index 93% rename from lib/expression/docs/function/comparison/deepEqual.js rename to lib/expression/docs/function/relational/deepEqual.js index b3f10aa3e..fde52d662 100644 --- a/lib/expression/docs/function/comparison/deepEqual.js +++ b/lib/expression/docs/function/relational/deepEqual.js @@ -1,6 +1,6 @@ module.exports = { 'name': 'deepEqual', - 'category': 'Comparison', + 'category': 'Relational', 'syntax': [ 'deepEqual(x, y)' ], diff --git a/lib/expression/docs/function/comparison/equal.js b/lib/expression/docs/function/relational/equal.js similarity index 93% rename from lib/expression/docs/function/comparison/equal.js rename to lib/expression/docs/function/relational/equal.js index 8b41bd5c9..e8906e536 100644 --- a/lib/expression/docs/function/comparison/equal.js +++ b/lib/expression/docs/function/relational/equal.js @@ -1,6 +1,6 @@ module.exports = { 'name': 'equal', - 'category': 'Comparison', + 'category': 'Relational', 'syntax': [ 'x == y', 'equal(x, y)' diff --git a/lib/expression/docs/function/comparison/larger.js b/lib/expression/docs/function/relational/larger.js similarity index 93% rename from lib/expression/docs/function/comparison/larger.js rename to lib/expression/docs/function/relational/larger.js index 223bd2c61..91777e29e 100644 --- a/lib/expression/docs/function/comparison/larger.js +++ b/lib/expression/docs/function/relational/larger.js @@ -1,6 +1,6 @@ module.exports = { 'name': 'larger', - 'category': 'Comparison', + 'category': 'Relational', 'syntax': [ 'x > y', 'larger(x, y)' diff --git a/lib/expression/docs/function/comparison/largerEq.js b/lib/expression/docs/function/relational/largerEq.js similarity index 93% rename from lib/expression/docs/function/comparison/largerEq.js rename to lib/expression/docs/function/relational/largerEq.js index 57aaf0d6a..530f67fa8 100644 --- a/lib/expression/docs/function/comparison/largerEq.js +++ b/lib/expression/docs/function/relational/largerEq.js @@ -1,6 +1,6 @@ module.exports = { 'name': 'largerEq', - 'category': 'Comparison', + 'category': 'Relational', 'syntax': [ 'x >= y', 'largerEq(x, y)' diff --git a/lib/expression/docs/function/comparison/smaller.js b/lib/expression/docs/function/relational/smaller.js similarity index 93% rename from lib/expression/docs/function/comparison/smaller.js rename to lib/expression/docs/function/relational/smaller.js index 25bebf36f..a5b58800e 100644 --- a/lib/expression/docs/function/comparison/smaller.js +++ b/lib/expression/docs/function/relational/smaller.js @@ -1,6 +1,6 @@ module.exports = { 'name': 'smaller', - 'category': 'Comparison', + 'category': 'Relational', 'syntax': [ 'x < y', 'smaller(x, y)' diff --git a/lib/expression/docs/function/comparison/smallerEq.js b/lib/expression/docs/function/relational/smallerEq.js similarity index 93% rename from lib/expression/docs/function/comparison/smallerEq.js rename to lib/expression/docs/function/relational/smallerEq.js index 355764697..f9abe54ac 100644 --- a/lib/expression/docs/function/comparison/smallerEq.js +++ b/lib/expression/docs/function/relational/smallerEq.js @@ -1,6 +1,6 @@ module.exports = { 'name': 'smallerEq', - 'category': 'Comparison', + 'category': 'Relational', 'syntax': [ 'x <= y', 'smallerEq(x, y)' diff --git a/lib/expression/docs/function/comparison/unequal.js b/lib/expression/docs/function/relational/unequal.js similarity index 94% rename from lib/expression/docs/function/comparison/unequal.js rename to lib/expression/docs/function/relational/unequal.js index 60ec7a20d..012153b9c 100644 --- a/lib/expression/docs/function/comparison/unequal.js +++ b/lib/expression/docs/function/relational/unequal.js @@ -1,6 +1,6 @@ module.exports = { 'name': 'unequal', - 'category': 'Comparison', + 'category': 'Relational', 'syntax': [ 'x != y', 'unequal(x, y)' diff --git a/lib/expression/docs/index.js b/lib/expression/docs/index.js index 19f9aeaf9..a6ad90790 100644 --- a/lib/expression/docs/index.js +++ b/lib/expression/docs/index.js @@ -48,15 +48,15 @@ exports.unaryMinus = require('./function/arithmetic/unaryMinus'); exports.unaryPlus = require('./function/arithmetic/unaryPlus'); exports.xgcd = require('./function/arithmetic/xgcd'); -// functions - comparison -exports.compare = require('./function/comparison/compare'); -exports.deepEqual = require('./function/comparison/deepEqual'); -exports['equal'] = require('./function/comparison/equal'); -exports.larger = require('./function/comparison/larger'); -exports.largerEq = require('./function/comparison/largerEq'); -exports.smaller = require('./function/comparison/smaller'); -exports.smallerEq = require('./function/comparison/smallerEq'); -exports.unequal = require('./function/comparison/unequal'); +// functions - relational +exports.compare = require('./function/relational/compare'); +exports.deepEqual = require('./function/relational/deepEqual'); +exports['equal'] = require('./function/relational/equal'); +exports.larger = require('./function/relational/larger'); +exports.largerEq = require('./function/relational/largerEq'); +exports.smaller = require('./function/relational/smaller'); +exports.smallerEq = require('./function/relational/smallerEq'); +exports.unequal = require('./function/relational/unequal'); // functions - complex exports.arg = require('./function/complex/arg'); diff --git a/lib/expression/parse.js b/lib/expression/parse.js index 2d6989e30..7160f5c52 100644 --- a/lib/expression/parse.js +++ b/lib/expression/parse.js @@ -542,7 +542,7 @@ function parseBitwiseConditions () { var name = token; getToken(); - var params = [node, parseComparison()]; + var params = [node, parseRelational()]; node = new OperatorNode(name, fn, params); } @@ -603,7 +603,7 @@ function parseRange () { function parseConditions () { var node, operators, name, fn, params; - node = parseComparison(); + node = parseRelational(); // TODO: precedence of And above Or? // TODO: implement a method for unit to number conversion @@ -624,7 +624,7 @@ function parseConditions () { fn = operators[name]; getToken(); - params = [node, parseComparison()]; + params = [node, parseRelational()]; node = new OperatorNode(name, fn, params); } @@ -632,11 +632,11 @@ function parseConditions () { } /** - * comparison operators + * relational operators * @return {Node} node * @private */ -function parseComparison () { +function parseRelational () { var node, operators, name, fn, params; node = parseAddSubtract(); diff --git a/lib/function/comparison/compare.js b/lib/function/relational/compare.js similarity index 100% rename from lib/function/comparison/compare.js rename to lib/function/relational/compare.js diff --git a/lib/function/comparison/deepEqual.js b/lib/function/relational/deepEqual.js similarity index 100% rename from lib/function/comparison/deepEqual.js rename to lib/function/relational/deepEqual.js diff --git a/lib/function/comparison/equal.js b/lib/function/relational/equal.js similarity index 100% rename from lib/function/comparison/equal.js rename to lib/function/relational/equal.js diff --git a/lib/function/comparison/larger.js b/lib/function/relational/larger.js similarity index 100% rename from lib/function/comparison/larger.js rename to lib/function/relational/larger.js diff --git a/lib/function/comparison/largerEq.js b/lib/function/relational/largerEq.js similarity index 100% rename from lib/function/comparison/largerEq.js rename to lib/function/relational/largerEq.js diff --git a/lib/function/comparison/smaller.js b/lib/function/relational/smaller.js similarity index 100% rename from lib/function/comparison/smaller.js rename to lib/function/relational/smaller.js diff --git a/lib/function/comparison/smallerEq.js b/lib/function/relational/smallerEq.js similarity index 100% rename from lib/function/comparison/smallerEq.js rename to lib/function/relational/smallerEq.js diff --git a/lib/function/comparison/unequal.js b/lib/function/relational/unequal.js similarity index 100% rename from lib/function/comparison/unequal.js rename to lib/function/relational/unequal.js diff --git a/lib/math.js b/lib/math.js index 2180d3eac..b0acbd50a 100644 --- a/lib/math.js +++ b/lib/math.js @@ -194,15 +194,15 @@ function factory (config) { require('./function/arithmetic/unaryPlus')(math, _config); require('./function/arithmetic/xgcd')(math, _config); - // functions - comparison - require('./function/comparison/compare')(math, _config); - require('./function/comparison/deepEqual')(math, _config); - require('./function/comparison/equal')(math, _config); - require('./function/comparison/larger')(math, _config); - require('./function/comparison/largerEq')(math, _config); - require('./function/comparison/smaller')(math, _config); - require('./function/comparison/smallerEq')(math, _config); - require('./function/comparison/unequal')(math, _config); + // functions - relational + require('./function/relational/compare')(math, _config); + require('./function/relational/deepEqual')(math, _config); + require('./function/relational/equal')(math, _config); + require('./function/relational/larger')(math, _config); + require('./function/relational/largerEq')(math, _config); + require('./function/relational/smaller')(math, _config); + require('./function/relational/smallerEq')(math, _config); + require('./function/relational/unequal')(math, _config); // functions - complex require('./function/complex/arg')(math, _config); diff --git a/test/expression/parse.test.js b/test/expression/parse.test.js index 8959b4575..b1c945912 100644 --- a/test/expression/parse.test.js +++ b/test/expression/parse.test.js @@ -906,7 +906,7 @@ describe('parse', function() { assert.deepEqual(parseAndEval('false ? 1:2:6'), new Matrix([2,3,4,5,6])); }); - it('should respect precedence of comparison operator and conversion operators', function () { + it('should respect precedence of equal operator and conversion operators', function () { var node = math.parse('a == b to c'); // (a == b) to c assert.equal(node.op, 'to'); @@ -914,7 +914,7 @@ describe('parse', function() { assert.equal(node2.op, 'to'); }); - it('should respect precedence of conditional operator and comparison operators', function () { + it('should respect precedence of conditional operator and relational operators', function () { var node = math.parse('a == b ? a > b : a < b'); assert(node instanceof ConditionalNode); assert.equal(node.condition.toString(), 'a == b'); @@ -930,7 +930,7 @@ describe('parse', function() { assert.equal(node.falseExpr.toString(), 'c:d'); }); - it.skip('should respect precedence of range operator and comparison operators', function () { + it.skip('should respect precedence of range operator and relational operators', function () { var node = math.parse('a:b == c:d'); assert(node instanceof OperatorNode); assert.equal(node.params[0].toString(), 'a:b'); diff --git a/test/function/comparison/compare.test.js b/test/function/relational/compare.test.js similarity index 100% rename from test/function/comparison/compare.test.js rename to test/function/relational/compare.test.js diff --git a/test/function/comparison/deepEqual.test.js b/test/function/relational/deepEqual.test.js similarity index 100% rename from test/function/comparison/deepEqual.test.js rename to test/function/relational/deepEqual.test.js diff --git a/test/function/comparison/equal.test.js b/test/function/relational/equal.test.js similarity index 100% rename from test/function/comparison/equal.test.js rename to test/function/relational/equal.test.js diff --git a/test/function/comparison/larger.test.js b/test/function/relational/larger.test.js similarity index 100% rename from test/function/comparison/larger.test.js rename to test/function/relational/larger.test.js diff --git a/test/function/comparison/largerEq.test.js b/test/function/relational/largerEq.test.js similarity index 100% rename from test/function/comparison/largerEq.test.js rename to test/function/relational/largerEq.test.js diff --git a/test/function/comparison/smaller.test.js b/test/function/relational/smaller.test.js similarity index 100% rename from test/function/comparison/smaller.test.js rename to test/function/relational/smaller.test.js diff --git a/test/function/comparison/smallerEq.test.js b/test/function/relational/smallerEq.test.js similarity index 100% rename from test/function/comparison/smallerEq.test.js rename to test/function/relational/smallerEq.test.js diff --git a/test/function/comparison/unequal.test.js b/test/function/relational/unequal.test.js similarity index 100% rename from test/function/comparison/unequal.test.js rename to test/function/relational/unequal.test.js