Javascript 后缀数学
Javascript Postfix Math
我 运行 遇到了一个关于程序速度的小问题,我想知道如何解决它。我正在接受以下形式的用户输入方程式:
"y = 3*x^2 - 2*x"
为简洁起见,我将使用此示例。将其转换为后缀后,我得到:
[ 3, x, 2, ^, *, 2, x, *, - ]
因此,如果我想绘制此图形,我只需简单地创建一个 x 值数组并找到相应的 y 值让我的线通过。但是,如果我可以接受此用户输入并将其转换为如下函数,则该函数的计算速度会快得多(这对于制作动画图形至关重要):
function userExpression( x ){
return 3*Math.pow(x,2)-2*x
}
有什么方法可以将此字符串转换为函数以加快计算速度。我很清楚我可以解析我所做的后缀表达式并且它会起作用,但我相当确定这将成为一个非常糟糕的瓶颈,特别是如果我正在使用 3D 图形.
我想在页面中注入 html 和 script
标签,但我想听听其他人在这种情况下会怎么做。另外,我很想知道您是如何用其他语言(例如 C 或 C++)来实现的,Python,任何真的。
如果您已经弄清楚如何解析表达式并生成必需的 Javascript 作为字符串,那么您可以通过使用 Function
构造函数创建编译函数来优化性能:
var expression = "return 3 * Math.pow(x, 2) - 2 * x;";
var func = new Function("x", expression);
snippet.log(func(-2));
snippet.log(func(-1));
snippet.log(func(0));
snippet.log(func(1));
snippet.log(func(2));
<!-- Provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
请记住关于 eval()
的所有常见注意事项,因为这实际上并没有什么不同,尽管它应该比 eval()
性能更高,因为该函数是在全局范围内编译的。
我 运行 遇到了一个关于程序速度的小问题,我想知道如何解决它。我正在接受以下形式的用户输入方程式:
"y = 3*x^2 - 2*x"
为简洁起见,我将使用此示例。将其转换为后缀后,我得到:
[ 3, x, 2, ^, *, 2, x, *, - ]
因此,如果我想绘制此图形,我只需简单地创建一个 x 值数组并找到相应的 y 值让我的线通过。但是,如果我可以接受此用户输入并将其转换为如下函数,则该函数的计算速度会快得多(这对于制作动画图形至关重要):
function userExpression( x ){
return 3*Math.pow(x,2)-2*x
}
有什么方法可以将此字符串转换为函数以加快计算速度。我很清楚我可以解析我所做的后缀表达式并且它会起作用,但我相当确定这将成为一个非常糟糕的瓶颈,特别是如果我正在使用 3D 图形.
我想在页面中注入 html 和 script
标签,但我想听听其他人在这种情况下会怎么做。另外,我很想知道您是如何用其他语言(例如 C 或 C++)来实现的,Python,任何真的。
如果您已经弄清楚如何解析表达式并生成必需的 Javascript 作为字符串,那么您可以通过使用 Function
构造函数创建编译函数来优化性能:
var expression = "return 3 * Math.pow(x, 2) - 2 * x;";
var func = new Function("x", expression);
snippet.log(func(-2));
snippet.log(func(-1));
snippet.log(func(0));
snippet.log(func(1));
snippet.log(func(2));
<!-- Provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
请记住关于 eval()
的所有常见注意事项,因为这实际上并没有什么不同,尽管它应该比 eval()
性能更高,因为该函数是在全局范围内编译的。