java.lang.Math 库提供了常用的数学计算工具
常量
final double E = 2.7182818284590452354; // 自然对数底数 final double PI = 3.14159265358979323846; // 圆周率 final double DEGREES_TO_RADIANS = 0.017453292519943295; // 角度转弧度 final double RADIANS_TO_DEGREES = 57.29577951308232; // 弧度转角度
取整
double delta = 0.0000001; assertEquals(Math.abs(-6), 6); assertEquals(Math.floor(-6.2), -7, delta); // 向下取整 assertEquals(Math.floor(6.2), 6, delta); assertEquals(Math.floor(6.8), 6, delta); assertEquals(Math.ceil(-6.2), -6, delta); // 向上取整 assertEquals(Math.ceil(6.2), 7, delta); assertEquals(Math.ceil(6.8), 7, delta); assertEquals(Math.round(-6.2), -6, delta); // 四舍五入 assertEquals(Math.round(6.2), 6, delta); assertEquals(Math.round(6.8), 7, delta); assertEquals(Math.round(-6.5), -6, delta); assertEquals(Math.round(6.5), 7, delta); assertEquals(Math.rint(-6.2), -6, delta); // 最接近整数,如果存在两个,返回偶数 assertEquals(Math.rint(6.2), 6, delta); assertEquals(Math.rint(6.8), 7, delta); assertEquals(Math.rint(-6.5), -6, delta); assertEquals(Math.rint(6.5), 6, delta); assertEquals(Math.floorDiv(7, 3), 2); assertEquals(Math.floorDiv(-7, 3), -3); assertEquals(Math.floorMod(7, 3), 1); assertEquals(Math.floorMod(-7, -3), -1); assertEquals(Math.floorMod(-7, 3), 2); assertEquals(-7 % -3, -1); assertEquals(-7 % 3, -1);
三角函数
assertEquals(Math.sin(Math.PI / 2), 1.0, delta); assertEquals(Math.cos(Math.PI), -1, delta); assertEquals(Math.tan(Math.PI / 4), 1.0, delta); assertEquals(Math.asin(1), Math.PI / 2, delta); assertEquals(Math.acos(-1), Math.PI, delta); assertEquals(Math.atan(1), Math.PI / 4, delta);
指数对数
assertEquals(Math.pow(3, 2), 9, delta); assertEquals(Math.pow(2, 3), 8, delta); assertEquals(Math.sqrt(4), 2, delta); assertEquals(Math.cbrt(27), 3, delta); assertEquals(Math.hypot(3, 4), 5, delta); // √(x² + y²) assertEquals(Math.exp(2.5), Math.pow(Math.E, 2.5), delta); // e ^ x assertEquals(Math.expm1(2), Math.exp(2) - 1, delta); // e ^ x - 1 assertEquals(Math.log(Math.exp(1.5)), 1.5, delta); // ln(x) assertEquals(Math.log10(1000), 3, delta); // lg(x) assertEquals(Math.log1p(Math.E - 1), 1, delta); // ln(1 + x)
双曲函数
assertEquals(Math.sinh(2), (Math.exp(2) - Math.exp(-2)) / 2, delta); // sinh(x) = (e ^ x - e ^ -x) / 2 assertEquals(Math.cosh(2), (Math.exp(2) + Math.exp(-2)) / 2, delta); // cosh(x) = (e ^ x + e ^ -x) / 2 assertEquals(Math.tanh(2), Math.sinh(2) / Math.cosh(2), delta); // tanh(x) = sinh(x) / cosh(x)
精确计算
普通的数值计算在溢出时是没有感知的,比如 Long.MAX_VALUE + 1 将得到结果 Long.MIN_VALUE,为了解决这种不合理,Math 提供了一些辅助函数,在结果溢出时将抛出异常
assertEquals(Long.MAX_VALUE + 1, Long.MIN_VALUE); // 溢出 assertThrows(ArithmeticException.class, () -> Math.addExact(Long.MAX_VALUE, 1)); // 加法溢出抛异常 assertThrows(ArithmeticException.class, () -> Math.multiplyExact(Long.MAX_VALUE, 2)); // 乘法 assertThrows(ArithmeticException.class, () -> Math.decrementExact(Long.MIN_VALUE)); // 递减 assertThrows(ArithmeticException.class, () -> Math.incrementExact(Long.MAX_VALUE)); // 递增 assertThrows(ArithmeticException.class, () -> Math.negateExact(Long.MIN_VALUE)); // 相反数 assertEquals(Math.addExact(1, 2), 3); assertEquals(Math.multiplyExact(2, 3), 6); assertEquals(Math.incrementExact(6), 7); assertEquals(Math.decrementExact(6), 5); assertEquals(Math.negateExact(-6), 6); assertEquals(Math.multiplyFull(1, 2), 2); // 接受两个 int 返回一个 long,防止溢出 assertEquals(Math.multiplyHigh(1, 2), 0); // 返回两个 long 乘积的高 64 位
浮点数
任意两个浮点数之间都有无数个浮点数,因此大部分浮点数是无法表示的,只能选取一个最接近的,java 提供了一些接口来获取能表示的浮点数
System.out.println(Math.nextUp(1.1)); // 下一个浮点数 System.out.println(Math.nextDown(1.1)); // 上一个浮点数 System.out.println(Math.nextAfter(1.1, Double.POSITIVE_INFINITY)); // 下一个浮点数 System.out.println(Math.nextAfter(1.1, Double.NEGATIVE_INFINITY)); // 上一个浮点数
随机数
math 库随机数
System.out.println(Math.random()); // 0 ~ 1 之间的随机数
java.lang.Random
Random 类提供了更丰富的随机方法,可以返回各种不同类型的随机数
Random r = new Random(); System.out.println(r.nextInt()); System.out.println(r.nextLong()); System.out.println(r.nextFloat()); System.out.println(r.nextDouble());
Random 还提供了流式 api
Random r = new Random(); List<Integer> li = r.ints().limit(10).boxed().map((x) -> Math.abs(x % 100)).collect(Collectors.toList()); System.out.println(li);
java.util.Random 是线程安全的,但是,跨线程的同时使用 java.util.Random 实例可能会遇到争用,从而导致性能下降。在多线程设计中考虑使用java.util.concurrent.ThreadLocalRandom 代替 java.util.Random,ThreadLocalRandom 和 Random 拥有一致的接口
链接
Math 测试代码: https://github.com/hatlonely/hellojava/blob/master/src/test/java/util/MathTest.java
随机数测试代码: https://github.com/hatlonely/hellojava/blob/master/src/test/java/util/RandomTest.java
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
11.1 计算数学 计算数学是关于通过计算来解决数学问题的科学。这里所说的“计算”既包括数值计算, 也包括符号计算;这里所说的“数学问题”可能来自纯数学,更可能是从各个科学和工程领 域抽象出来的。计算数学包括很多分支,其中最核心、应用最广的是数值方法。 数值方法 数值方法(numerical method,也称计算方法、数值分析等)是利用计算机进行数值计 算来解决数学问题的方法,其研究内容包括数值
Jupyter Notebooks 你可以按[shift] + [Enter]或按菜单中的“播放”按钮来运行单元格。 在function(后面按[shift] + [tab],可以获得函数或对象的帮助。 你还可以通过执行function?获得帮助。 NumPy 数组 操作numpy数组是 Python 机器学习(或者,实际上是任何类型的科学计算)的重要部分。 对大多数人来说,这可能是一个简短的回顾
问题内容: 我在使用apache commons数学库时遇到问题。 我只想创建f(x)= 4x ^ 2 + 2x之类的函数,然后计算该函数的导数 -> f’(x)= 8x + 2 我阅读了有关差异化的文章(http://commons.apache.org/proper/commons- math/userguide/analysis.html,第4.7节)。 有一个我不明白的例子: 在第5行中,
问题内容: 我遇到了一个问题,我正在开发一个应该能够进行一些数学计算的应用程序。这些计算必须是准确的(或者显然不是错误的) 但是这个简单的代码 给我一个错误的结果c不是预期的0.003048而是0.0030480000000000004这显然是错误的。 第二个代码片段给出了正确的结果。 我知道在使用计算机进行计算时,并不是所有的浮点运算都是精确的,但是我不知道如何解决这个问题。 提前致谢! 路德维
1.2.2 计算思维的具体例子 基于计算机的能力和局限,计算机科学家提出了很多关于计算的思想和方法,从而建立 了利用计算机解决问题的一整套思维工具。下面我们简要介绍计算机科学家在计算的不同阶 段所采用的常见思想和方法。 问题表示 用计算机解决问题,首先要建立问题的计算机表示。问题表示与问题求解是紧密相关的, 如果问题的表示合适,那么问题的解法就可能如水到渠成一般容易得到,否则可能如逆水行 舟一般难
"Doing thenumbers" factor 将一个正数分解为多个素数. bash$ factor 27417 27417: 3 13 19 37 bc Bash 不能处理浮点运算, 并且缺乏特定的一些操作,这些操作都是一些重要的计算功能.幸运的是, bc 可以解决这个问题. bc 不仅仅是个多功能灵活的精确的工具, 而且它还提供许多编程语言才具备的一些方便的