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

公众号程序猿DD

共 8414字,需浏览 17分钟

 · 2021-02-26


MXReflection,一个基于mXparser库功能的Java复杂计算框架。

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

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

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

<dependency>

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

</dependency>
dependencies {

    compile group: 'com.github.ismail-mekni', name: 'mxreflection', version: '1.0.1'

}

那如何使用这个框架呢?

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

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

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

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

案例1:

package com.ismail.mxreflection.example;

import com.ismail.mxreflection.annotations.Arg;

import com.ismail.mxreflection.annotations.Expression;

import com.ismail.mxreflection.core.Calculator;

import com.ismail.mxreflection.factory.MXFactory;

import org.junit.Test;

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

案例2:

package com.ismail.mxreflection.example;

import com.ismail.mxreflection.annotations.Arg;

import com.ismail.mxreflection.annotations.Expression;

import com.ismail.mxreflection.core.Calculator;

import com.ismail.mxreflection.factory.MXFactory;

import org.junit.Test;

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

  • Long

  • long

  • String

  • BigInteger

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

关注我,回复关键词“mxreflection”,获取源码库及项目示例!

如果你喜欢本文,欢迎关注我,订阅更多精彩内容
关注我回复「加群」,加入Spring技术交流群



往期推荐

谨记!怎么样的编程会让你进监狱?

505天,240,000字,我总结了Spring Security 的学习曲线,免费送给大家

保姆级教程:Spring Boot 单元测试

搞开源也会被死亡恐吓!

@Autowire 和 @Resource 注解使用的正确姿势,别再用错的了!!

好用到爆!多种数据库只需一个工具就能搞定!


喜欢的这里报道

↘↘↘

浏览 10
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报