How to get real value in math function
Hello everyone, I have this code that does functions in math, but with this function, the result is wrong oO
x = 0
"- 3 * X ^ 2-16 * X + 2"
Code:
public static void main(String[] args) throws Exception {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
engine.put("X", 0);
Object operation = engine.eval("-3*X^2-16*X+2");
//Object operation2 = engine.eval("(X+3)");
System.out.println("Evaluado operacion 1: " + operation);
//System.out.println("Evaluado operacion 2: " + operation2);
}
the result is 2, but I get 4
Operation Evaluado 1: 4
I have some other code that I did
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package gustavo_santa;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import javax.swing.JOptionPane;
/**
*
* @author osmarvirux
*/
public class SerieB {
//xi and x4
int xi;
int x4;
//f(x) function variables
String positive_negative;
int num_one;
int elevation_one;
String add_subtract_one;
int num_two;
int elevation_two;
String add_subtract_two;
int num_three;
//results
String xi_result;
String x4_result;
public SerieB(int xi, int x4, String positive_negative, int num_one, int elevation_one, String add_subtract_one, int num_two, int elevation_two, String add_subtract_two, int num_three) {
this.xi = xi;
this.x4 = x4;
this.positive_negative = positive_negative;
this.num_one = num_one;
this.elevation_one = elevation_one;
this.add_subtract_one = add_subtract_one;
this.num_two = num_two;
this.elevation_two = elevation_two;
this.add_subtract_two = add_subtract_two;
this.num_three = num_three;
}
public void Procedure_xi(){
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
if (positive_negative == "-"){
try {
xi_result=(num_one*(Math.pow(xi, elevation_one)))+add_subtract_one+(num_two*(Math.pow(xi, elevation_two)))
+add_subtract_two+num_three;
Object result = engine.eval(xi_result);
System.out.println(xi_result+" = "+result);
} catch(ScriptException se) {
se.printStackTrace();
}
}else{
try {
xi_result=((-num_one*(Math.pow(xi, elevation_one)))+add_subtract_one+(num_two*(Math.pow(xi, elevation_two)))
+add_subtract_two+num_three);
Object result = engine.eval(xi_result);
System.out.println(xi_result+" = "+result);
} catch(ScriptException se) {
se.printStackTrace();
}
}
}
public void Procedure_x4(){
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
if (positive_negative == "-"){
try {
x4_result=(num_one*(Math.pow(x4, elevation_one)))+add_subtract_one+(num_two*(Math.pow(x4, elevation_two)))
+add_subtract_two+num_three;
Object result = engine.eval(x4_result);
System.out.println(x4_result+" = "+result);
} catch(ScriptException se) {
se.printStackTrace();
}
}else{
try {
x4_result=((-num_one*(Math.pow(x4, elevation_one)))+add_subtract_one+(num_two*(Math.pow(x4, elevation_two)))
+add_subtract_two+num_three);
Object result = engine.eval(x4_result);
System.out.println(x4_result+" = "+result);
} catch(ScriptException se) {
se.printStackTrace();
}
}
}
public static void main(String[] args){
//-3x^2-16x+2
SerieB obj = new SerieB(0, 1, "+", -3, 2, "-", 16, 1, "+", 2);
obj.Procedure_xi();
obj.Procedure_x4();
}
}
the result with this code is 2, but I want to use
ScriptEngineManager manager = new ScriptEngineManager (); ScriptEngineManager manager = new ScriptEngineManager ();
because it is a library and I think it is more accurate and I don’t want to use my code because there are many lines and I don’t know if it is 100% efficient. can someone help me? or give me a recommendation to allow these math functions? many thanks
The result you are getting is correct.
The confusion arises from the fact that what you think of as the force operator ( ^
) is actually the bitwise XOR operator in JavaScript (you are using a JavaScript script).
So, the estimate 0 ^ 2
gives 2
, and when the estimate is Math.pow(0, 2)
obtained 0
, therefore, the difference.
To get the expected result, the expression would have to read:
-3*Math.pow(X,2)-16*X+2
You can preprocess the expression to replace exponential operations with calls Math.pow()
:
let X = 0;
let expression = "-3*X^2-16*X+2"
let processed = expression.replace(/(\w+)\^(\w+)/g, 'Math.pow($1,$2)');
console.log(processed); // prints "-3*Math.pow(X,2)-16*X+2"
console.log(eval(processed)); // prints "2"
Using a script engine it might look like this:
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
engine.put("X", 0);
engine.put("expression", "-3*X^2-16*X+2");
engine.put("processed", engine.eval("expression.replace(/(\\w+)\\^(\\w+)/g, 'Math.pow($1,$2)')"));
System.out.println(engine.eval("eval(processed)")); // 2.0
Or, if you prefer Java's regular expression replacement:
String expression = "-3*X^2-16*X+2";
String processed = expression.replaceAll("(\\w+)\\^(\\w+)", "Math.pow($1,$2)");
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
engine.put("X", 0);
System.out.println(engine.eval(processed)); // 2.0
I think your program is going by evaluating
(-3*0)^2 - 16*0 + 2 = 0^2 +2 = 2+2 =4
because an operator ^
in computer science means bitwise exception or, which basically means the bits are 1 or 0 and then change them to 0, otherwise 1. And 2 is represented 10
and 0 is 0
, so2^0 = 2
Try replacing ^2
with *X
, alternatively you can use Math.pow(X,n)
if you need a degree of elevation to some power n
, but for squaring it is better to just write it asX*X
Below is deprecation due to changes in the question, but still functional:
In the second part of your question, you wrote
Object operation = engine.eval("-3*(X^2)-16*X +2");
String processed = operation.replace(/(\w+)\^(\w+)/g, 'Math.pow($1,$2)');
based on another user's answer. You should have written
String expr = "-3*(X^2)-16*X +2";
String processed = expr.replaceAll("(\\w+)(\\^)(\\w+)", 'Math.pow($1,$2'));
Object operation = engine.eval(processed);
You have the wrong syntax for food. Replace -3*X^2-16*X+2
with -3*Math.pow(X,2)-16*X+2
. See Javascript. What does the ^ (caret) operator do?