2

Java中sin、log、tan等复杂数学运算怎么搞?

 3 years ago
source link: https://blog.didispace.com/opensource-java-math-mxreflection/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Java中sin、log、tan等复杂数学运算怎么搞?

还记不记得求学时代各种复杂的数学公式?sin、log2、tan等等等,是不是看到这就觉得算起来麻烦?

通过MXReflection框架,你可以使用Java计算这些曾经我们觉得无比复杂的数学运算和函数,只需使用与类相关的字段。

MXReflection可以从指定字段读取值,并将结果注入@Expression注释字段。

<dependency>
<groupId>com.github.ismail-mekni</groupId>
<artifactId>mxreflection</artifactId>
<version>1.0.1</version>
</dependency>

那如何使用这个框架呢?

很简单,只需要两个java注释。

1、通过@Arg值,我们可以指定要在目标函数中使用的自定义参数名称。

2、@Expression注释值包含带有参数的函数表达式。

这个框架的使用其实不难,下面是两个计算案例,通过案例其实很容易理解该怎么使用此框架:

public class Example1Test {

class Example1 {

@Arg("f1")

String field1;

@Arg("f2")

int field2;

@Expression("f1 * sin(f2) * log2(f1 + f2) + der(cos(f1), f1) * pi + int(tan(f2), f2, 0, e)")

double field3;

}

@Test

public void example1Test() {

Example1 example1 = new Example1();

example1.field1 = "2.2";

example1.field2 = 5;

Calculator<Example1> calculator = MXFactory.createCalculator(Example1.class);

calculator.calculate(example1);

System.out.println("Field 3 result: " + example1.field3);

}

}

Output:

Field 3 result: -34.32819235851987
public class Example2Test {

public class Example2{

@Arg("f1")

private String field1;

@Arg("f2")

private Long field2;

@Expression("f2 - f1")

@Arg("f3")

private double field3;

@Expression("f3 - f2")

@Arg("f4")

private double field4;

@Expression("f1 - f2")

@Arg("f5")

private Double field5;

@Expression("f4-f5")

@Arg("f6")

private String field6;

@Expression("f6-f5")

@Arg("f7")

private long field7;

@Expression("f7+5")

private Long field8;

}

@Test

public void exampleTest() {

Example2 example2 = new Example2();

example2.field1 = "2.2";
example1.field2 = 5; Calculator<Example2> calculator = MXFactory.createCalculator(Example2.class);

calculator.calculate(example2);

System.out.println("Field 3 result: " + example2.field3);

System.out.println("Field 4 result: " + example2.field4);

System.out.println("Field 5 result: " + example2.field5);

System.out.println("Field 6 result: " + example2.field6);

System.out.println("Field 7 result: " + example2.field7);

System.out.println("Field 8 result: " + example2.field8);

}

}

Output:

Field 3 result: 2.8
Field 4 result: -2.2
Field 5 result: -2.8
Field 6 result: 0.6
Field 7 result: 3
Field 8 result: 8

MXReflection框架支持mXparser数学库中提供的数学集合如下:

  • Operators (+, -, *, /, #, !, ^)
  • Binary Relations (=, ==, =<, =>, <, >, <>, !=, ~=)
  • Boolean Operators (&, &&, /, ~&, ~&&, ~/, |, ||…)
  • Bitwise Operators (@~, @&, @^, @|, @<<, @>>)
  • Unary Functions (sin, cos, tan, tg, ctan, ctg, cot, sec,…)
  • Binary Functions (log, mod, C, Bern, Stirl1, Stirl2, …)
  • 3-args Functions (if, chi, CHi, Chi, cHi, pUni, cUni, qUni, pNor, cNor, qNor)
  • Variadic Functions (iff, min, max, ConFrac, ConPol, gcd, …)
  • Iterated Operators (sum, prod, avg, vari, stdi, mini, maxi)
  • Calculus Operators (int, der, der-, der+, dern, diff, difb)
  • Math Constants (pi, e, [gam], [phi], [PN], [B*], [F’d], [F’a], …)
  • Physical Constants ([c], [G.], [g], [hP], [h-], [lP], [mP], [tP])
  • Astronomical Constants ([ly], [au], [pc], [kpc], [Earth-R-eq], …)
  • Random Variables ([Uni], [Int], [Int1], [Int2], [Int3], [Int4], …)
  • Metric prefixes ([%], [%%], [Y], [sept], [Z], [sext], [E], …)
  • Parser Symbols ((, ), ,, ;)
  • Units

在参数解析方面,MXReflection支持以数字内容作为参数的所有字段数据类型。您可以将所有Java类型与返回数值结果的toString实现一起使用。支持的结果字段java类型有:

  • Double
  • double
  • String
  • BigInteger

但是要注意的是注意,对于long、long和BigInteger,MXReflection使用在注入前解析最终结果。建议确保表达式返回整数类型。

扫描二维码关注我,回复关键词mxreflection,获取源码库及项目示例!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK