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
source to share
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
source to share
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);
source to share
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?
source to share