Latest commit

History

64 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

java.math.expression.parser

java math expression parser is a maven project that lets you parse or evaluate math expressions.

This algorithm does not use a decision tree. It is a kind of Recursive Descent Parser (https://en.wikipedia.org/wiki/Recursive_descent_parser). In fact, it is LR parser (Left-Right Parser) without backtracking.

This algorithm is faster than JEP math expresion parser!!! If you compare java.math.expression.parse and JEP, this algorithm only needs 25% of the time to parse the same expression as JEP. With other algorithms that use trees like:

 ---------
| + |
---------
|
---------------
| |
--------- ---------
| 1 | | * |
--------- ---------

It is even faster than them. This library is 10 times faster and it is tested using matlab. The python version of this library is pymep. You can find pymep in my github repository.

Features

math functions

  • sin, cos, sinh, cosh, tan, tanh, asin, acos, atan
  • pi, e
  • ln (natural logarithm), log (decimal logarithm)
  • sqrt, cbrt
  • radians or degrees
  • complex or real numbers

parentheses

  • (...)

variables:

  • Expressions in vars

    String f_xs = "x+5*y+(3 -y)";
    final Point xo = new Point("x", "1+1");
    final Point yo = new Point("y", "0+2*0+1*5-5 +1^4")
    

Examples:

In the test package you can see more examples with different constructors

Real numbers

 Parser.simpleEval("6.5*7.8^2.3 + (3.5^3+7/2)^3 -(5*4/(2-3))*4"); --> for real functions
String f_x = "+3 +5*5*(+1)";
ParserResult result = Parser.eval(f_x); --> for real or complex functions
assertTrue(result.getValue() == 28.0);
final Point xo = new Point("x", new Double(2));
f_x = "2.35*e^(-3)*x";
result = Parser.eval(f_x, xo); --> for real or complex functions with real or complex vars
assertTrue(result.getValue() == 0.2339992213289606);
final Point xo = new Point("x", new Double(2));
final Point zo = new Point("z", new Double(1));
String f_xs = " 2*(-(((z*3)*sqrt(x^(2)))+3))"; Parser.eval(f_xs, xo, zo); --> multiple vars
String f_xs = "x+5*y+(3 -y)";
final Point xo = new Point("x", "1+1");
final Point yo = new Point("y", "0+2*0+1*5-5 +1^4"); //math expression in vars
ParserResult result = Parser.eval(f_xs, xo, yo);

Complex numbers

 String f_x = " e^(1*x*acos((3/2-2j)^(pi)))";
Point xo = new Point("x", new Complex(1, 2)); --> complex var: 1+ 2j
ParserResult result = Parser.eval(f_x, xo);
String f_x = "1+j +x";
final Point xo = new Point("x", "2 +j"); //complex math expression in vars
ParserResult result = Parser.eval(f_x, xo);

Execution time

 These are the results for the version 3.0 (master). You can check the speedTests in the project
Parser.simpleEval("6.5*7.8^2.3 + (3.5^3+7/2)^3 -(5*4/(2-3))*4 + 6.5*7.8^2.3
+ (3.5^3+7/2)^3 -(5*4/(2-3))*4 + 6.5*7.8^2.3 + (3.5^3+7/2)^3 -(5*4/(2-3))*4 + 6.5*7.8^2.3 + (3.5^3+7/2)^3 -(5*4/(2-3))*4");
CPU: i7-6500U
test 1: one execution: 3ms
test 2: 100000 executions : 2100 ms --> mean time 0.021 ms per execution (with graalvm-jdk-17.0.8+9.1 the total time is 754ms --> 0.00754 per execution) test 3: one million executions: 16500 ms --> mean time 0.0165 ms per execution (with graalvm-jdk-17.0.8+9.1 the total time is 7980ms --> 0,00798 per execution) 

This version is compiled for Java 1.6

If you are interested in maths, you can visit my java numerical library in my github repository which uses java.math.expression.parser to evaluate functions.

Professional Services

If you are interested in logical parsers or any task related to parsers, you can consult my professional services page https://github.com/sbesada/professional.services

Donation

If you think that my work deserves a donation, you can do it: https://sbesada.github.io/

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

64 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

java.math.expression.parser

java math expression parser is a maven project that lets you parse or evaluate math expressions.

This algorithm does not use a decision tree. It is a kind of Recursive Descent Parser (https://en.wikipedia.org/wiki/Recursive_descent_parser). In fact, it is LR parser (Left-Right Parser) without backtracking.

This algorithm is faster than JEP math expresion parser!!! If you compare java.math.expression.parse and JEP, this algorithm only needs 25% of the time to parse the same expression as JEP. With other algorithms that use trees like:

 ---------
| + |
---------
|
---------------
| |
--------- ---------
| 1 | | * |
--------- ---------

It is even faster than them. This library is 10 times faster and it is tested using matlab. The python version of this library is pymep. You can find pymep in my github repository.

Features

math functions

  • sin, cos, sinh, cosh, tan, tanh, asin, acos, atan
  • pi, e
  • ln (natural logarithm), log (decimal logarithm)
  • sqrt, cbrt
  • radians or degrees
  • complex or real numbers

parentheses

  • (...)

variables:

  • Expressions in vars

    String f_xs = "x+5*y+(3 -y)";
    final Point xo = new Point("x", "1+1");
    final Point yo = new Point("y", "0+2*0+1*5-5 +1^4")
    

Examples:

In the test package you can see more examples with different constructors

Real numbers

 Parser.simpleEval("6.5*7.8^2.3 + (3.5^3+7/2)^3 -(5*4/(2-3))*4"); --> for real functions
String f_x = "+3 +5*5*(+1)";
ParserResult result = Parser.eval(f_x); --> for real or complex functions
assertTrue(result.getValue() == 28.0);
final Point xo = new Point("x", new Double(2));
f_x = "2.35*e^(-3)*x";
result = Parser.eval(f_x, xo); --> for real or complex functions with real or complex vars
assertTrue(result.getValue() == 0.2339992213289606);
final Point xo = new Point("x", new Double(2));
final Point zo = new Point("z", new Double(1));
String f_xs = " 2*(-(((z*3)*sqrt(x^(2)))+3))"; Parser.eval(f_xs, xo, zo); --> multiple vars
String f_xs = "x+5*y+(3 -y)";
final Point xo = new Point("x", "1+1");
final Point yo = new Point("y", "0+2*0+1*5-5 +1^4"); //math expression in vars
ParserResult result = Parser.eval(f_xs, xo, yo);

Complex numbers

 String f_x = " e^(1*x*acos((3/2-2j)^(pi)))";
Point xo = new Point("x", new Complex(1, 2)); --> complex var: 1+ 2j
ParserResult result = Parser.eval(f_x, xo);
String f_x = "1+j +x";
final Point xo = new Point("x", "2 +j"); //complex math expression in vars
ParserResult result = Parser.eval(f_x, xo);

Execution time

 These are the results for the version 3.0 (master). You can check the speedTests in the project
Parser.simpleEval("6.5*7.8^2.3 + (3.5^3+7/2)^3 -(5*4/(2-3))*4 + 6.5*7.8^2.3
+ (3.5^3+7/2)^3 -(5*4/(2-3))*4 + 6.5*7.8^2.3 + (3.5^3+7/2)^3 -(5*4/(2-3))*4 + 6.5*7.8^2.3 + (3.5^3+7/2)^3 -(5*4/(2-3))*4");
CPU: i7-6500U
test 1: one execution: 3ms
test 2: 100000 executions : 2100 ms --> mean time 0.021 ms per execution (with graalvm-jdk-17.0.8+9.1 the total time is 754ms --> 0.00754 per execution) test 3: one million executions: 16500 ms --> mean time 0.0165 ms per execution (with graalvm-jdk-17.0.8+9.1 the total time is 7980ms --> 0,00798 per execution) 

This version is compiled for Java 1.6

If you are interested in maths, you can visit my java numerical library in my github repository which uses java.math.expression.parser to evaluate functions.

Professional Services

If you are interested in logical parsers or any task related to parsers, you can consult my professional services page https://github.com/sbesada/professional.services

Donation

If you think that my work deserves a donation, you can do it: https://sbesada.github.io/

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

64 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

java.math.expression.parser

java math expression parser is a maven project that lets you parse or evaluate math expressions.

This algorithm does not use a decision tree. It is a kind of Recursive Descent Parser (https://en.wikipedia.org/wiki/Recursive_descent_parser). In fact, it is LR parser (Left-Right Parser) without backtracking.

This algorithm is faster than JEP math expresion parser!!! If you compare java.math.expression.parse and JEP, this algorithm only needs 25% of the time to parse the same expression as JEP. With other algorithms that use trees like:

 ---------
| + |
---------
|
---------------
| |
--------- ---------
| 1 | | * |
--------- ---------

It is even faster than them. This library is 10 times faster and it is tested using matlab. The python version of this library is pymep. You can find pymep in my github repository.

Features

math functions

  • sin, cos, sinh, cosh, tan, tanh, asin, acos, atan
  • pi, e
  • ln (natural logarithm), log (decimal logarithm)
  • sqrt, cbrt
  • radians or degrees
  • complex or real numbers

parentheses

  • (...)

variables:

  • Expressions in vars

    String f_xs = "x+5*y+(3 -y)";
    final Point xo = new Point("x", "1+1");
    final Point yo = new Point("y", "0+2*0+1*5-5 +1^4")
    

Examples:

In the test package you can see more examples with different constructors

Real numbers

 Parser.simpleEval("6.5*7.8^2.3 + (3.5^3+7/2)^3 -(5*4/(2-3))*4"); --> for real functions
String f_x = "+3 +5*5*(+1)";
ParserResult result = Parser.eval(f_x); --> for real or complex functions
assertTrue(result.getValue() == 28.0);
final Point xo = new Point("x", new Double(2));
f_x = "2.35*e^(-3)*x";
result = Parser.eval(f_x, xo); --> for real or complex functions with real or complex vars
assertTrue(result.getValue() == 0.2339992213289606);
final Point xo = new Point("x", new Double(2));
final Point zo = new Point("z", new Double(1));
String f_xs = " 2*(-(((z*3)*sqrt(x^(2)))+3))"; Parser.eval(f_xs, xo, zo); --> multiple vars
String f_xs = "x+5*y+(3 -y)";
final Point xo = new Point("x", "1+1");
final Point yo = new Point("y", "0+2*0+1*5-5 +1^4"); //math expression in vars
ParserResult result = Parser.eval(f_xs, xo, yo);

Complex numbers

 String f_x = " e^(1*x*acos((3/2-2j)^(pi)))";
Point xo = new Point("x", new Complex(1, 2)); --> complex var: 1+ 2j
ParserResult result = Parser.eval(f_x, xo);
String f_x = "1+j +x";
final Point xo = new Point("x", "2 +j"); //complex math expression in vars
ParserResult result = Parser.eval(f_x, xo);

Execution time

 These are the results for the version 3.0 (master). You can check the speedTests in the project
Parser.simpleEval("6.5*7.8^2.3 + (3.5^3+7/2)^3 -(5*4/(2-3))*4 + 6.5*7.8^2.3
+ (3.5^3+7/2)^3 -(5*4/(2-3))*4 + 6.5*7.8^2.3 + (3.5^3+7/2)^3 -(5*4/(2-3))*4 + 6.5*7.8^2.3 + (3.5^3+7/2)^3 -(5*4/(2-3))*4");
CPU: i7-6500U
test 1: one execution: 3ms
test 2: 100000 executions : 2100 ms --> mean time 0.021 ms per execution (with graalvm-jdk-17.0.8+9.1 the total time is 754ms --> 0.00754 per execution) test 3: one million executions: 16500 ms --> mean time 0.0165 ms per execution (with graalvm-jdk-17.0.8+9.1 the total time is 7980ms --> 0,00798 per execution) 

This version is compiled for Java 1.6

If you are interested in maths, you can visit my java numerical library in my github repository which uses java.math.expression.parser to evaluate functions.

Professional Services

If you are interested in logical parsers or any task related to parsers, you can consult my professional services page https://github.com/sbesada/professional.services

Donation

If you think that my work deserves a donation, you can do it: https://sbesada.github.io/

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

64 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

java.math.expression.parser

java math expression parser is a maven project that lets you parse or evaluate math expressions.

This algorithm does not use a decision tree. It is a kind of Recursive Descent Parser (https://en.wikipedia.org/wiki/Recursive_descent_parser). In fact, it is LR parser (Left-Right Parser) without backtracking.

This algorithm is faster than JEP math expresion parser!!! If you compare java.math.expression.parse and JEP, this algorithm only needs 25% of the time to parse the same expression as JEP. With other algorithms that use trees like:

 ---------
| + |
---------
|
---------------
| |
--------- ---------
| 1 | | * |
--------- ---------

It is even faster than them. This library is 10 times faster and it is tested using matlab. The python version of this library is pymep. You can find pymep in my github repository.

Features

math functions

  • sin, cos, sinh, cosh, tan, tanh, asin, acos, atan
  • pi, e
  • ln (natural logarithm), log (decimal logarithm)
  • sqrt, cbrt
  • radians or degrees
  • complex or real numbers

parentheses

  • (...)

variables:

  • Expressions in vars

    String f_xs = "x+5*y+(3 -y)";
    final Point xo = new Point("x", "1+1");
    final Point yo = new Point("y", "0+2*0+1*5-5 +1^4")
    

Examples:

In the test package you can see more examples with different constructors

Real numbers

 Parser.simpleEval("6.5*7.8^2.3 + (3.5^3+7/2)^3 -(5*4/(2-3))*4"); --> for real functions
String f_x = "+3 +5*5*(+1)";
ParserResult result = Parser.eval(f_x); --> for real or complex functions
assertTrue(result.getValue() == 28.0);
final Point xo = new Point("x", new Double(2));
f_x = "2.35*e^(-3)*x";
result = Parser.eval(f_x, xo); --> for real or complex functions with real or complex vars
assertTrue(result.getValue() == 0.2339992213289606);
final Point xo = new Point("x", new Double(2));
final Point zo = new Point("z", new Double(1));
String f_xs = " 2*(-(((z*3)*sqrt(x^(2)))+3))"; Parser.eval(f_xs, xo, zo); --> multiple vars
String f_xs = "x+5*y+(3 -y)";
final Point xo = new Point("x", "1+1");
final Point yo = new Point("y", "0+2*0+1*5-5 +1^4"); //math expression in vars
ParserResult result = Parser.eval(f_xs, xo, yo);

Complex numbers

 String f_x = " e^(1*x*acos((3/2-2j)^(pi)))";
Point xo = new Point("x", new Complex(1, 2)); --> complex var: 1+ 2j
ParserResult result = Parser.eval(f_x, xo);
String f_x = "1+j +x";
final Point xo = new Point("x", "2 +j"); //complex math expression in vars
ParserResult result = Parser.eval(f_x, xo);

Execution time

 These are the results for the version 3.0 (master). You can check the speedTests in the project
Parser.simpleEval("6.5*7.8^2.3 + (3.5^3+7/2)^3 -(5*4/(2-3))*4 + 6.5*7.8^2.3
+ (3.5^3+7/2)^3 -(5*4/(2-3))*4 + 6.5*7.8^2.3 + (3.5^3+7/2)^3 -(5*4/(2-3))*4 + 6.5*7.8^2.3 + (3.5^3+7/2)^3 -(5*4/(2-3))*4");
CPU: i7-6500U
test 1: one execution: 3ms
test 2: 100000 executions : 2100 ms --> mean time 0.021 ms per execution (with graalvm-jdk-17.0.8+9.1 the total time is 754ms --> 0.00754 per execution) test 3: one million executions: 16500 ms --> mean time 0.0165 ms per execution (with graalvm-jdk-17.0.8+9.1 the total time is 7980ms --> 0,00798 per execution) 

This version is compiled for Java 1.6

If you are interested in maths, you can visit my java numerical library in my github repository which uses java.math.expression.parser to evaluate functions.

Professional Services

If you are interested in logical parsers or any task related to parsers, you can consult my professional services page https://github.com/sbesada/professional.services

Donation

If you think that my work deserves a donation, you can do it: https://sbesada.github.io/

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

64 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

java.math.expression.parser

java math expression parser is a maven project that lets you parse or evaluate math expressions.

This algorithm does not use a decision tree. It is a kind of Recursive Descent Parser (https://en.wikipedia.org/wiki/Recursive_descent_parser). In fact, it is LR parser (Left-Right Parser) without backtracking.

This algorithm is faster than JEP math expresion parser!!! If you compare java.math.expression.parse and JEP, this algorithm only needs 25% of the time to parse the same expression as JEP. With other algorithms that use trees like:

 ---------
| + |
---------
|
---------------
| |
--------- ---------
| 1 | | * |
--------- ---------

It is even faster than them. This library is 10 times faster and it is tested using matlab. The python version of this library is pymep. You can find pymep in my github repository.

Features

math functions

  • sin, cos, sinh, cosh, tan, tanh, asin, acos, atan
  • pi, e
  • ln (natural logarithm), log (decimal logarithm)
  • sqrt, cbrt
  • radians or degrees
  • complex or real numbers

parentheses

  • (...)

variables:

  • Expressions in vars

    String f_xs = "x+5*y+(3 -y)";
    final Point xo = new Point("x", "1+1");
    final Point yo = new Point("y", "0+2*0+1*5-5 +1^4")
    

Examples:

In the test package you can see more examples with different constructors

Real numbers

 Parser.simpleEval("6.5*7.8^2.3 + (3.5^3+7/2)^3 -(5*4/(2-3))*4"); --> for real functions
String f_x = "+3 +5*5*(+1)";
ParserResult result = Parser.eval(f_x); --> for real or complex functions
assertTrue(result.getValue() == 28.0);
final Point xo = new Point("x", new Double(2));
f_x = "2.35*e^(-3)*x";
result = Parser.eval(f_x, xo); --> for real or complex functions with real or complex vars
assertTrue(result.getValue() == 0.2339992213289606);
final Point xo = new Point("x", new Double(2));
final Point zo = new Point("z", new Double(1));
String f_xs = " 2*(-(((z*3)*sqrt(x^(2)))+3))"; Parser.eval(f_xs, xo, zo); --> multiple vars
String f_xs = "x+5*y+(3 -y)";
final Point xo = new Point("x", "1+1");
final Point yo = new Point("y", "0+2*0+1*5-5 +1^4"); //math expression in vars
ParserResult result = Parser.eval(f_xs, xo, yo);

Complex numbers

 String f_x = " e^(1*x*acos((3/2-2j)^(pi)))";
Point xo = new Point("x", new Complex(1, 2)); --> complex var: 1+ 2j
ParserResult result = Parser.eval(f_x, xo);
String f_x = "1+j +x";
final Point xo = new Point("x", "2 +j"); //complex math expression in vars
ParserResult result = Parser.eval(f_x, xo);

Execution time

 These are the results for the version 3.0 (master). You can check the speedTests in the project
Parser.simpleEval("6.5*7.8^2.3 + (3.5^3+7/2)^3 -(5*4/(2-3))*4 + 6.5*7.8^2.3
+ (3.5^3+7/2)^3 -(5*4/(2-3))*4 + 6.5*7.8^2.3 + (3.5^3+7/2)^3 -(5*4/(2-3))*4 + 6.5*7.8^2.3 + (3.5^3+7/2)^3 -(5*4/(2-3))*4");
CPU: i7-6500U
test 1: one execution: 3ms
test 2: 100000 executions : 2100 ms --> mean time 0.021 ms per execution (with graalvm-jdk-17.0.8+9.1 the total time is 754ms --> 0.00754 per execution) test 3: one million executions: 16500 ms --> mean time 0.0165 ms per execution (with graalvm-jdk-17.0.8+9.1 the total time is 7980ms --> 0,00798 per execution) 

This version is compiled for Java 1.6

If you are interested in maths, you can visit my java numerical library in my github repository which uses java.math.expression.parser to evaluate functions.

Professional Services

If you are interested in logical parsers or any task related to parsers, you can consult my professional services page https://github.com/sbesada/professional.services

Donation

If you think that my work deserves a donation, you can do it: https://sbesada.github.io/

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

64 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

java.math.expression.parser

java math expression parser is a maven project that lets you parse or evaluate math expressions.

This algorithm does not use a decision tree. It is a kind of Recursive Descent Parser (https://en.wikipedia.org/wiki/Recursive_descent_parser). In fact, it is LR parser (Left-Right Parser) without backtracking.

This algorithm is faster than JEP math expresion parser!!! If you compare java.math.expression.parse and JEP, this algorithm only needs 25% of the time to parse the same expression as JEP. With other algorithms that use trees like:

 ---------
| + |
---------
|
---------------
| |
--------- ---------
| 1 | | * |
--------- ---------

It is even faster than them. This library is 10 times faster and it is tested using matlab. The python version of this library is pymep. You can find pymep in my github repository.

Features

math functions

  • sin, cos, sinh, cosh, tan, tanh, asin, acos, atan
  • pi, e
  • ln (natural logarithm), log (decimal logarithm)
  • sqrt, cbrt
  • radians or degrees
  • complex or real numbers

parentheses

  • (...)

variables:

  • Expressions in vars

    String f_xs = "x+5*y+(3 -y)";
    final Point xo = new Point("x", "1+1");
    final Point yo = new Point("y", "0+2*0+1*5-5 +1^4")
    

Examples:

In the test package you can see more examples with different constructors

Real numbers

 Parser.simpleEval("6.5*7.8^2.3 + (3.5^3+7/2)^3 -(5*4/(2-3))*4"); --> for real functions
String f_x = "+3 +5*5*(+1)";
ParserResult result = Parser.eval(f_x); --> for real or complex functions
assertTrue(result.getValue() == 28.0);
final Point xo = new Point("x", new Double(2));
f_x = "2.35*e^(-3)*x";
result = Parser.eval(f_x, xo); --> for real or complex functions with real or complex vars
assertTrue(result.getValue() == 0.2339992213289606);
final Point xo = new Point("x", new Double(2));
final Point zo = new Point("z", new Double(1));
String f_xs = " 2*(-(((z*3)*sqrt(x^(2)))+3))"; Parser.eval(f_xs, xo, zo); --> multiple vars
String f_xs = "x+5*y+(3 -y)";
final Point xo = new Point("x", "1+1");
final Point yo = new Point("y", "0+2*0+1*5-5 +1^4"); //math expression in vars
ParserResult result = Parser.eval(f_xs, xo, yo);

Complex numbers

 String f_x = " e^(1*x*acos((3/2-2j)^(pi)))";
Point xo = new Point("x", new Complex(1, 2)); --> complex var: 1+ 2j
ParserResult result = Parser.eval(f_x, xo);
String f_x = "1+j +x";
final Point xo = new Point("x", "2 +j"); //complex math expression in vars
ParserResult result = Parser.eval(f_x, xo);

Execution time

 These are the results for the version 3.0 (master). You can check the speedTests in the project
Parser.simpleEval("6.5*7.8^2.3 + (3.5^3+7/2)^3 -(5*4/(2-3))*4 + 6.5*7.8^2.3
+ (3.5^3+7/2)^3 -(5*4/(2-3))*4 + 6.5*7.8^2.3 + (3.5^3+7/2)^3 -(5*4/(2-3))*4 + 6.5*7.8^2.3 + (3.5^3+7/2)^3 -(5*4/(2-3))*4");
CPU: i7-6500U
test 1: one execution: 3ms
test 2: 100000 executions : 2100 ms --> mean time 0.021 ms per execution (with graalvm-jdk-17.0.8+9.1 the total time is 754ms --> 0.00754 per execution) test 3: one million executions: 16500 ms --> mean time 0.0165 ms per execution (with graalvm-jdk-17.0.8+9.1 the total time is 7980ms --> 0,00798 per execution) 

This version is compiled for Java 1.6

If you are interested in maths, you can visit my java numerical library in my github repository which uses java.math.expression.parser to evaluate functions.

Professional Services

If you are interested in logical parsers or any task related to parsers, you can consult my professional services page https://github.com/sbesada/professional.services

Donation

If you think that my work deserves a donation, you can do it: https://sbesada.github.io/

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

64 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

java.math.expression.parser

java math expression parser is a maven project that lets you parse or evaluate math expressions.

This algorithm does not use a decision tree. It is a kind of Recursive Descent Parser (https://en.wikipedia.org/wiki/Recursive_descent_parser). In fact, it is LR parser (Left-Right Parser) without backtracking.

This algorithm is faster than JEP math expresion parser!!! If you compare java.math.expression.parse and JEP, this algorithm only needs 25% of the time to parse the same expression as JEP. With other algorithms that use trees like:

 ---------
| + |
---------
|
---------------
| |
--------- ---------
| 1 | | * |
--------- ---------

It is even faster than them. This library is 10 times faster and it is tested using matlab. The python version of this library is pymep. You can find pymep in my github repository.

Features

math functions

  • sin, cos, sinh, cosh, tan, tanh, asin, acos, atan
  • pi, e
  • ln (natural logarithm), log (decimal logarithm)
  • sqrt, cbrt
  • radians or degrees
  • complex or real numbers

parentheses

  • (...)

variables:

  • Expressions in vars

    String f_xs = "x+5*y+(3 -y)";
    final Point xo = new Point("x", "1+1");
    final Point yo = new Point("y", "0+2*0+1*5-5 +1^4")
    

Examples:

In the test package you can see more examples with different constructors

Real numbers

 Parser.simpleEval("6.5*7.8^2.3 + (3.5^3+7/2)^3 -(5*4/(2-3))*4"); --> for real functions
String f_x = "+3 +5*5*(+1)";
ParserResult result = Parser.eval(f_x); --> for real or complex functions
assertTrue(result.getValue() == 28.0);
final Point xo = new Point("x", new Double(2));
f_x = "2.35*e^(-3)*x";
result = Parser.eval(f_x, xo); --> for real or complex functions with real or complex vars
assertTrue(result.getValue() == 0.2339992213289606);
final Point xo = new Point("x", new Double(2));
final Point zo = new Point("z", new Double(1));
String f_xs = " 2*(-(((z*3)*sqrt(x^(2)))+3))"; Parser.eval(f_xs, xo, zo); --> multiple vars
String f_xs = "x+5*y+(3 -y)";
final Point xo = new Point("x", "1+1");
final Point yo = new Point("y", "0+2*0+1*5-5 +1^4"); //math expression in vars
ParserResult result = Parser.eval(f_xs, xo, yo);

Complex numbers

 String f_x = " e^(1*x*acos((3/2-2j)^(pi)))";
Point xo = new Point("x", new Complex(1, 2)); --> complex var: 1+ 2j
ParserResult result = Parser.eval(f_x, xo);
String f_x = "1+j +x";
final Point xo = new Point("x", "2 +j"); //complex math expression in vars
ParserResult result = Parser.eval(f_x, xo);

Execution time

 These are the results for the version 3.0 (master). You can check the speedTests in the project
Parser.simpleEval("6.5*7.8^2.3 + (3.5^3+7/2)^3 -(5*4/(2-3))*4 + 6.5*7.8^2.3
+ (3.5^3+7/2)^3 -(5*4/(2-3))*4 + 6.5*7.8^2.3 + (3.5^3+7/2)^3 -(5*4/(2-3))*4 + 6.5*7.8^2.3 + (3.5^3+7/2)^3 -(5*4/(2-3))*4");
CPU: i7-6500U
test 1: one execution: 3ms
test 2: 100000 executions : 2100 ms --> mean time 0.021 ms per execution (with graalvm-jdk-17.0.8+9.1 the total time is 754ms --> 0.00754 per execution) test 3: one million executions: 16500 ms --> mean time 0.0165 ms per execution (with graalvm-jdk-17.0.8+9.1 the total time is 7980ms --> 0,00798 per execution) 

This version is compiled for Java 1.6

If you are interested in maths, you can visit my java numerical library in my github repository which uses java.math.expression.parser to evaluate functions.

Professional Services

If you are interested in logical parsers or any task related to parsers, you can consult my professional services page https://github.com/sbesada/professional.services

Donation

If you think that my work deserves a donation, you can do it: https://sbesada.github.io/

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

64 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

java.math.expression.parser

java math expression parser is a maven project that lets you parse or evaluate math expressions.

This algorithm does not use a decision tree. It is a kind of Recursive Descent Parser (https://en.wikipedia.org/wiki/Recursive_descent_parser). In fact, it is LR parser (Left-Right Parser) without backtracking.

This algorithm is faster than JEP math expresion parser!!! If you compare java.math.expression.parse and JEP, this algorithm only needs 25% of the time to parse the same expression as JEP. With other algorithms that use trees like:

 ---------
| + |
---------
|
---------------
| |
--------- ---------
| 1 | | * |
--------- ---------

It is even faster than them. This library is 10 times faster and it is tested using matlab. The python version of this library is pymep. You can find pymep in my github repository.

Features

math functions

  • sin, cos, sinh, cosh, tan, tanh, asin, acos, atan
  • pi, e
  • ln (natural logarithm), log (decimal logarithm)
  • sqrt, cbrt
  • radians or degrees
  • complex or real numbers

parentheses

  • (...)

variables:

  • Expressions in vars

    String f_xs = "x+5*y+(3 -y)";
    final Point xo = new Point("x", "1+1");
    final Point yo = new Point("y", "0+2*0+1*5-5 +1^4")
    

Examples:

In the test package you can see more examples with different constructors

Real numbers

 Parser.simpleEval("6.5*7.8^2.3 + (3.5^3+7/2)^3 -(5*4/(2-3))*4"); --> for real functions
String f_x = "+3 +5*5*(+1)";
ParserResult result = Parser.eval(f_x); --> for real or complex functions
assertTrue(result.getValue() == 28.0);
final Point xo = new Point("x", new Double(2));
f_x = "2.35*e^(-3)*x";
result = Parser.eval(f_x, xo); --> for real or complex functions with real or complex vars
assertTrue(result.getValue() == 0.2339992213289606);
final Point xo = new Point("x", new Double(2));
final Point zo = new Point("z", new Double(1));
String f_xs = " 2*(-(((z*3)*sqrt(x^(2)))+3))"; Parser.eval(f_xs, xo, zo); --> multiple vars
String f_xs = "x+5*y+(3 -y)";
final Point xo = new Point("x", "1+1");
final Point yo = new Point("y", "0+2*0+1*5-5 +1^4"); //math expression in vars
ParserResult result = Parser.eval(f_xs, xo, yo);

Complex numbers

 String f_x = " e^(1*x*acos((3/2-2j)^(pi)))";
Point xo = new Point("x", new Complex(1, 2)); --> complex var: 1+ 2j
ParserResult result = Parser.eval(f_x, xo);
String f_x = "1+j +x";
final Point xo = new Point("x", "2 +j"); //complex math expression in vars
ParserResult result = Parser.eval(f_x, xo);

Execution time

 These are the results for the version 3.0 (master). You can check the speedTests in the project
Parser.simpleEval("6.5*7.8^2.3 + (3.5^3+7/2)^3 -(5*4/(2-3))*4 + 6.5*7.8^2.3
+ (3.5^3+7/2)^3 -(5*4/(2-3))*4 + 6.5*7.8^2.3 + (3.5^3+7/2)^3 -(5*4/(2-3))*4 + 6.5*7.8^2.3 + (3.5^3+7/2)^3 -(5*4/(2-3))*4");
CPU: i7-6500U
test 1: one execution: 3ms
test 2: 100000 executions : 2100 ms --> mean time 0.021 ms per execution (with graalvm-jdk-17.0.8+9.1 the total time is 754ms --> 0.00754 per execution) test 3: one million executions: 16500 ms --> mean time 0.0165 ms per execution (with graalvm-jdk-17.0.8+9.1 the total time is 7980ms --> 0,00798 per execution) 

This version is compiled for Java 1.6

If you are interested in maths, you can visit my java numerical library in my github repository which uses java.math.expression.parser to evaluate functions.

Professional Services

If you are interested in logical parsers or any task related to parsers, you can consult my professional services page https://github.com/sbesada/professional.services

Donation

If you think that my work deserves a donation, you can do it: https://sbesada.github.io/

Releases

Packages

Used by

Contributors

Languages