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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 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注释值包含带有参数的函数表达式。

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

案例1

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

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,获取源码库及项目示例!


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
4月前
|
Java Apache 开发工具
【Azure 事件中心】 org.slf4j.Logger 收集 Event Hub SDK(Java) 输出日志并以文件形式保存
【Azure 事件中心】 org.slf4j.Logger 收集 Event Hub SDK(Java) 输出日志并以文件形式保存
|
2月前
|
人工智能 Oracle Java
解决 Java 打印日志吞异常堆栈的问题
前几天有同学找我查一个空指针问题,Java 打印日志时,异常堆栈信息被吞了,导致定位不到出问题的地方。
36 2
|
4月前
|
Java
【Java基础面试十一】、int和Integer有什么区别,二者在做==运算时会得到什么结果?
这篇文章解释了Java中`int`基本数据类型和其包装类`Integer`之间的区别,并指出在进行`==`运算时,`Integer`会拆箱为`int`类型,然后比较它们的值是否相等。
【Java基础面试十一】、int和Integer有什么区别,二者在做==运算时会得到什么结果?
|
4月前
|
Java 应用服务中间件 HSF
Java应用结构规范问题之配置Logback以仅记录错误级别的日志到一个滚动文件中的问题如何解决
Java应用结构规范问题之配置Logback以仅记录错误级别的日志到一个滚动文件中的问题如何解决
|
4月前
|
Java 应用服务中间件 HSF
Java应用结构规范问题之配置Logback以在控制台输出日志的问题如何解决
Java应用结构规范问题之配置Logback以在控制台输出日志的问题如何解决
|
4月前
|
Java 应用服务中间件 HSF
Java应用结构规范问题之AllLoggers接口获取异常日志的Logger实例的问题如何解决
Java应用结构规范问题之AllLoggers接口获取异常日志的Logger实例的问题如何解决
|
4月前
|
存储 消息中间件 监控
Java日志详解:日志级别,优先级、配置文件、常见日志管理系统ELK、日志收集分析
Java日志详解:日志级别,优先级、配置文件、常见日志管理系统、日志收集分析。日志级别从小到大的关系(优先级从低到高): ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF 低级别的会输出高级别的信息,高级别的不会输出低级别的信息
|
4月前
|
Java Linux C++
【Azure 应用服务】App Service For Linux 部署Java Spring Boot应用后,查看日志文件时的疑惑
【Azure 应用服务】App Service For Linux 部署Java Spring Boot应用后,查看日志文件时的疑惑
|
5月前
|
存储 Java
浅析JAVA日志中的性能实践与原理解释问题之测试日志内容大小对系统性能的影响问题如何解决
浅析JAVA日志中的性能实践与原理解释问题之测试日志内容大小对系统性能的影响问题如何解决
111 0
|
5月前
|
Java 程序员 Linux
浅析JAVA日志中的性能实践与原理解释问题之使用日志框架记录日志问题如何解决
浅析JAVA日志中的性能实践与原理解释问题之使用日志框架记录日志问题如何解决