在android中处理负平方根

时间:2017-09-02 13:44:29

标签: java android

我正在研究Android的函数绘图仪项目,其中用户将方程输入为字符串。

这个字符串是使用EvalEx库解决的,我得到了一堆数据点,我使用图形视图库绘制。

现在问题是我给它一个负平方根的方程。例如SQRT(1-x)这会导致错误。

for( i = 0; i < x.length ; i++) {
     //the equation solver only takes BigDecimal as input.
     x1 = new BigDecimal(x[i]);
     try {
         // eq is the sting that i got from the EditText. 
         y1 = new Expression(eq).with("x", x1).eval();
         y[i] = y1.floatValue();
     } catch(ArithmeticException excp) {
         //these are the data points that go into the plot function
         x[i] = 0;
         y[i] = 0;
     }
}

1 个答案:

答案 0 :(得分:0)

我仍然有点不清楚你想做什么,但我认为我理解足以给你一个明确的答案。

这就是事情:

  • eval(...)函数返回单个值。

这就是API所说的。这就是它所能做的一切。你无法避免这一事实。 (没有魔法.....)

因此,如果你想获得两个(真实的)平方根,你需要取SQRT返回的正结果并自己否定它以获得第二个解决方案。在你的代码中。像这样:

     y1 = new Expression("SQRT(3 - x^2)").with("x", x1).eval();
     y2 = BigDecimal.ZERO - y1;

当然,这是特殊情况代码 1 。当SQRT函数可能位于表达式的任何位置时,没有通用代码可以为您提供多个方程式解决方案。

使用EvalEx API,复杂解决方案的表达式将更加棘手。您无法使用BigDecimal方法返回的(单个)eval来表示复杂的解决方案。 (如果你查看代码,取一个负数的平方根会抛出API的ExpressionException。)

底线是EvalEx是一个简单,轻量级的表达式评估器。 未设计用于您的用例,包括查找所有解决方案和/或处理复杂数字。并且使现有API适用于这些用例是不可能的。

但好消息是EvalEx的源代码可以在GitHub上找到。

可以下载它并将其作为编写更复杂的表达式评估程序的起点。

或者......你可以找一个能满足你需要的替代库。

1 - 也就是说,它是通过预先知道我们正在评估的表达式来实现的!此外,x的值仍为3 - x^2,而isitapalindromealready = lambda x: "" if isPalindrome(x) else "not" 为负数。