Guava 12-数学运算
2016-11-10 23:34
483 查看
范例
int logFloor = LongMath.log2(n, FLOOR); int mustNotOverflow = IntMath.checkedMultiply(x, y); long quotient = LongMath.divide(knownMultipleOfThree, 3, RoundingMode.UNNECESSARY); // fail fast on non-multiple of 3 BigInteger nearestInteger = DoubleMath.roundToBigInteger(d, RoundingMode.HALF_EVEN); BigInteger sideLength = BigIntegerMath.sqrt(area, CEILING);
为什么使用Guava Math
Guava Math针对各种不常见的溢出情况都有充分的测试;对溢出语义,Guava文档也有相应的说明;如果运算的溢出检查不能通过,将导致快速失败;Guava Math的性能经过了精心的设计和调优;虽然性能不可避免地依据具体硬件细节而有所差异,但Guava Math的速度通常可以与Apache Commons的MathUtils相比,在某些场景下甚至还有显著提升;
Guava Math在设计上考虑了可读性和正确的编程习惯;IntMath.log2(x, CEILING) 所表达的含义,即使在快速阅读时也是清晰明确的。而32-Integer.numberOfLeadingZeros(x – 1)对于阅读者来说则不够清晰。
注意:Guava Math和GWT格外不兼容,这是因为Java和Java Script语言的运算溢出逻辑不一样。
整数运算
Guava Math主要处理三种整数类型:int、long和BigInteger。这三种类型的运算工具类分别叫做IntMath、LongMath和BigIntegerMath。有溢出检查的运算
Guava Math提供了若干有溢出检查的运算方法:结果溢出时,这些方法将快速失败而不是忽略溢出IntMath.checkedAdd | LongMath.checkedAdd |
IntMath.checkedSubtract | LongMath.checkedSubtract |
IntMath.checkedMultiply | LongMath.checkedMultiply |
IntMath.checkedPow | LongMath.checkedPow |
IntMath.checkedAdd(Integer.MAX_VALUE, Integer.MAX_VALUE); // throws ArithmeticException
实数运算
IntMath、LongMath和BigIntegerMath提供了很多实数运算的方法,并把最终运算结果舍入成整数。这些方法接受一个java.math.RoundingMode枚举值作为舍入的模式:DOWN:向零方向舍入(去尾法)
UP:远离零方向舍入
FLOOR:向负无限大方向舍入
CEILING:向正无限大方向舍入
UNNECESSARY:不需要舍入,如果用此模式进行舍入,应直接抛出ArithmeticException
HALF_UP:向最近的整数舍入,其中x.5远离零方向舍入
HALF_DOWN:向最近的整数舍入,其中x.5向零方向舍入
HALF_EVEN:向最近的整数舍入,其中x.5向相邻的偶数舍入
这些方法旨在提高代码的可读性,例如,divide(x, 3, CEILING) 即使在快速阅读时也是清晰。此外,这些方法内部采用构建整数近似值再计算的实现,除了在构建sqrt(平方根)运算的初始近似值时有浮点运算,其他方法的运算全过程都是整数或位运算,因此性能上更好。
// returns 31622776601683793319988935444327185337195551393252 BigIntegerMath.sqrt(BigInteger.TEN.pow(99), RoundingMode.HALF_EVEN);
附加功能
Guava还另外提供了一些有用的运算函数*阶乘和二项式系数的运算结果如果溢出,则返回MAX_VALUE
浮点数运算
JDK比较彻底地涵盖了浮点数运算,但Guava在DoubleMath类中也提供了一些有用的方法。isMathematicalInteger(double) | 判断该浮点数是不是一个整数 |
roundToInt(double, RoundingMode) | 舍入为int;对无限小数、溢出抛出异常 |
roundToLong(double, RoundingMode) | 舍入为long;对无限小数、溢出抛出异常 |
roundToBigInteger(double, RoundingMode) | 舍入为BigInteger;对无限小数抛出异常 |
log2(double, RoundingMode) | 2的浮点对数,并且舍入为int,比JDK的Math.log(double) 更快 |
相关文章推荐
- JavaScript学习笔记12-数学运算
- java实现数学表达式的运算(Stack)
- Python标准库12 数学与随机数 (math包,random包)
- UOJ 12|【UER #1】猜数|数学
- 通过shell进行数学运算的多种方式
- 数学之美(系列十八) 之 矩阵运算和文本处理中的分类问题
- python复习笔记[2]——数学运算
- Unity Mathf 数学运算(C#)
- [unity基础教程] unity Mathf 数学运算(C#)
- Python3学习笔记12-标准库之多进程、数学、循环器、数据库sqLite
- shell变量数学运算
- MYSQL 数学运算符问题
- 数学之美 系列 12 - 余弦定理和新闻的分类
- Unity Mathf 数学运算(C#)
- java字符串数学公式运算
- 用2个栈实现数学运算
- 用C\C++实现离散数学简单逻辑运算
- Php基础数学运算篇
- python笔记12 - 装饰器,模块(时间,数学)
- 洛谷P1582(位运算的应用+数学)