【Java】浅析Math类
来总结一下一个有用的类:Math!!
属于java.lang.Math,即java.lang包,不需要import.
当然,为了方便用其中大量的静态方法和类变量,也可以用静态导入:
import static java.lang.Math;
Math类包含执行基本数字运算的方法,如初等指数、对数、平方根和三角函数。
与类StricMath的一些数值方法不同,Math类的所有等价函数的实现都没有定义为返回位相同结果的位。这种松弛允许在不需要严格再现性的情况下更好地执行。
(简单的说明一下StrictMath类:
StricMath类包含执行基本数值运算的方法,如初等指数函数、对数函数、平方根函数和三角函数。
为了帮助确保Java程序的可移植性,这个包中的一些数值函数的定义要求它们产生与某些已发布的算法相同的结果。这些算法可以从著名的网络库netlib获得,作为包“自由分配的数学库”fdlibm。这些算法以C语言编写,然后被理解为遵循Java浮点运算规则的所有浮点运算来执行。
Java Math库是针对fdlbm版本5.3定义的。如果fdlibm为函数(如acos)提供多个定义,请使用“IEEE 754核心函数”版本(位于名称以字母e开头的文件中)。需要fdlibm语义的方法有sin、cos、tan、asin、acos、atan、exp、log、log10、cbrt、atan2、pow、sinh、cosh、tanh、hypot、expm1和log1p。
该平台使用带符号二的整数补码算法和int和long原语类型。开发人员应该选择原语类型,以确保算术运算一致地产生正确的结果,这在某些情况下意味着运算不会超出计算值的范围。最佳实践是选择基元类型和算法以避免溢出。在大小为int或long且需要检测溢出错误的情况下,当结果溢出时,addExact, subtractExact, multiplyExact, 和toIntExact方法会引发算术异常(ArithmeticException)。对于其他算术运算,如除、绝对值、递增、递减和负溢出,只会出现特定的最小值或最大值,应根据最小值或最大值进行检查。)
在默认情况下,许多Math方法只是简单地称之为StrictMath中的等价方法来实现它们。鼓励代码生成器使用特定于平台的本机库或微处理器指令(如果可用),以提供更高性能的Math方法实现。如此高的性能实现仍然必须符合数学规范。
实施规范的质量关系到两个方面,返回结果的准确性和方法的单调性。浮点Math方法的准确度是以ulp为单位进行测量的,最后是以单位进行测量的。对于Agiven浮点格式,特定实数值的ulp是包含该数值的两个浮点值之间的距离。当将一个方法作为一个整体而不是某个特定的参数来讨论它的准确性时,引用的ULP的数量对于任何参数的最坏情况都是错误的。如果一个方法的错误总是小于0.5 ulps,那么该方法总是返回最接近精确结果的浮点数字;这样的方法是正确的。正确的四舍五入法通常是最好的浮点数近似法;然而,任何形式的浮点数法都不能正确地四舍五入。相反,对于Math类,对于某些方法,允许使用较大的1或2 ulps的错误范围。通常情况下,如果有1ulp的误差限制,当精确结果是一个可表示的数字时,应将精确结果作为计算结果返回;否则,括号中的两个浮点值中的任何一个都可能被返回。对于规模较大的精确结果,括号的一个端点可能是无限的。除个别论据的准确性外,保持不同论据的方法之间的适当关系也很重要。因此,误差大于0.5ulp的大多数方法都要求是半单调的:无论何时数学函数是递减的,浮点近似也是,同样,无论何时数学函数是非递增的,浮点近似也是。并非所有精度为1的近似值都能自动满足单调性要求。
该平台使用带符号二的整数补码算法,并带有int和long基元类型。开发人员应选择原语类型以确保算术运算一致地产生正确的结果,这在某些情况下意味着运算不会超出计算值的范围。最佳做法是选择原语类型和算法以避免溢出。当大小为int或long且需要检测溢出错误时,addexact、subtractexact、multiplyexact和tointexact方法会在结果溢出时引发算术异常。对于除、绝对值、增量为1、减量为1和负数等其他算术操作,溢出只在特定的最小值或最大值,应根据最小值或最大值进行检查。
蒟蒻萌新瑟瑟发抖。。。
我们对比版本可见:Math类是1.0版本就有的;StrictMath类是1.3版本才有的。
继续讲Math类,它有两个静态的属性(类变量):E和PI,注意是大写哦!调用的时候往往是表示为Math.E和Math.PI。
functions
再讲讲Math类的方法(全是静态的):
一共有50种不同名的方法:
abs(…a):作用是返回参数的绝对值
参数可以是double、float、int、long四种,返回对应的类型acos(double a):作用是返回参数的反余弦函数的值
参数是double型,返回浮点数从0.0到π,π也是以浮点数呈现
输入数据限定-1到1,否则会返回NaN(非数)addExact(…x, …y):作用是返回两参数的和(求和)
参数是int+int或者long+long,返回对应类型的数值
一旦求和后结果发生溢出会抛出异常asin(double a):作用是返回参数的反正弦函数的值
参数是double型,返回浮点数从-π/2到π/2,π也是以浮点数呈现
输入数据限定-1到1,否则会返回NaN(非数)atan(double a):作用是返回参数的反正切函数的值
参数是double型,返回浮点数从-π/2到π/2,π也是以浮点数呈现
POSITIVE_INFINITY和NEGATIVE_INFINITY不能用做参数的atan2(double y,double x):作用是返回从直角坐标(x,y)转换为极坐标(r,θ)的θ角
返回double型cbrt(double a):作用是返回参数的立方根
返回double型ceil(double a):作用是返回大于或等于参数且数值上等于整数的最小(最接近负无穷大)的浮点数
返回double型
解释的通俗点就是向上取整后转成数学上相等的double型copySign(…magnitude, …sign):返回第一个参数,它会带上第二个浮点参数符号(+/-)
参数可以是double、float两种,返回对应的类型
返回double型cos(double a):作用是返回参数的余弦函数的值
返回double型cosh(double x):作用是返回参数的双曲余弦函数的值
返回double型decrementExact(…a):作用是返回参数-1的值
参数可以是int、long两种,返回对应的类型
一旦-1后结果发生溢出会抛出异常exp(double a):作用是返回e^a,以e为底的指数函数
返回double型expm1(double x):作用是返回(e^a)-1,以e为底的指数函数值-1
返回double型floor(double a):作用是返回小于或等于参数且数值上等于整数的最大(最接近正无穷大)的浮点数
返回double型floorDiv(…x, …y):作用是返回小于或等于代数运算所得商的最大(最接近正无穷大)值
参数可以是int+int、long+int、long+long三种
int+int返回int,其余两个返回longfloorMod(…x, …y):作用是返回小于或等于代数运算所得模的最大(最接近正无穷大)值
参数可以是int+int、long+int、long+long三种
int+int返回int,其余两个返回longfma(…a, …b, …c):作用是返回前两个数相加后与第三个数相乘得到的值
参数可以是double+double+double、float+float+float两种,返回对应的类型getExponent(…d/f):作用是返回无偏指数
参数可以是double d、float f两种
返回int
无偏指数的话,可以在这里看一看咯,自行理解:Herehypot(double x, double y):作用是返回没有中间溢出或下溢的sqrt(x^2 + y^2)
返回double型IEEEremainder(double f1, double f2):作用是根据IEEE754标准的规定,对两个参数计算剩余操作
返回double型incrementExact(…a):作用是返回参数+1
参数可以是int、long两种,返回对应的类型
一旦+1后结果发生溢出会抛出异常log(double a):作用是返回参数的自然对数(以e为底a的对数)
返回double型log10(double a):作用是返回参数的常用对数(以10为底a的对数)
返回double型log1p(double x):作用是返回参数+1后取的自然对数(以e为底a+1的对数)
返回double型max(…a, …b):作用是返回两个数里最大的(相对更大的)一个数
参数可以是double+double、float+float、int+int、long+long四种,返回对应的类型min(…a, …b):作用是返回两个数里最小的(相对更小的)一个数
参数可以是double+double、float+float、int+int、long+long四种,返回对应的类型multiplyExact(…x, …y):作用是返回两个数的乘积
参数可以是int+int、long+int、long+long三种
int+int返回int,其余两个返回long
一旦做乘积后结果发生溢出会抛出异常multiplyFull(int x, int y):作用是返回参数的精确的数学乘积
参数为int,返回longmultiplyHigh(long x,long y):作用是作为一个long返回两个64位因子的128位积中最重要的64位
返回longnegateExact(…a):作用是返回参数的相反数
参数可以是int、long两种,返回对应的类型
取相反数后如果溢出会抛出异常nextAfter(…start, …direction):作用是返回第二个参数方向上与第一个参数相邻的浮点数
参数可以是double+double、float+double两种
返回值随第一个参数走
这个方法我简单的解释一下:我用的其中三组测试数据是这样的:
System.out.println(Math.nextAfter(1.0, 2.0));
System.out.println(Math.nextAfter(1.0, 10.0));
System.out.println(Math.nextAfter(1.0, -1.0));
输出结果则是:
1.0000000000000002
1.0000000000000002
0.9999999999999999
相信大家自行体会可以明白的
- nextDown(…d/f):作用是返回在负无穷大方向上与d/f相邻的浮点值
参数可以是double d、float f两种,返回对应的类型
这个方法我简单的解释一下:我用的其中四组测试数据是这样的:
System.out.println(Math.nextDown(1.0));
System.out.println(Math.nextDown(2.0));
System.out.println(Math.nextDown(3.0));
System.out.println(Math.nextDown(10.0));
输出结果则是:
0.9999999999999999
1.9999999999999998
2.9999999999999996
9.999999999999998
相信大家自行体会可以明白的
nextUp(…d/f):作用是返回在正无穷大方向上与d/f相邻的浮点值
参数可以是double d、float f两种,返回对应的类型
和上面的33.nextDown(…)方法类似,不做赘述pow(double a, double b):作用是返回第一个参数的第二个参数次幂(a^b)
返回double型random():作用是返回一个介于0.0和1.0之间的(伪随机)正数
伪随机数的知识可以参考百度百科:https://baike.baidu.com/item/%E4%BC%AA%E9%9A%8F%E6%9C%BA%E6%95%B0/104358?fr=aladdin
返回double型rint(double a):作用是返回在数学上等于与参数值最接近且是整数的double
返回double型
(解释的比较拗口,抱歉)
解释的通俗一点就是四舍五入后取数学上相等的double型浮点round(…a):作用是返回参数四舍五入后的整数值
参数可以是double、float两种
double参数返回long,float参数返回intscalb(…d/f, nt scaleFactor):作用是返回d ×2^scaleFactor
参数可以是double d、float f两种,返回对应的类型
相当于浮点×double的感觉signum(…d/f):作用是返回符号函数的值
参数可以是double d 、float f两种,返回对应的类型
啰嗦点说就是返回参数的signum函数:如果参数为零,则返回零;如果参数大于零,则返回1.0;如果参数小于零,则返回-1.0
实在不懂符号函数可以参考百度百科sin(double a):作用是返回参数的正弦函数的值
返回double型sinh(double x):作用是返回参数的双曲正弦函数的值
返回double型sqrt(double a):作用是返回四舍五入后的参数的平方根值
返回double型subtractExact(…x, …y):作用是返回两参数的差
参数可以是int+int、long+long两种,返回对应的类型
结果如果超出相应范围则抛出异常tan(double a):作用是返回参数的正切函数的值
返回double型tanh(double x):作用是返回参数双曲正切函数的值
返回double型toDegrees(double angrad):作用是将以弧度度量的角度转换为以度度量的近似等效角度
返回double型toIntExact(long value):作用是将long转换成对应的int值输出
返回int
如果超出int值的范围则抛出异常toRadians(double angdeg):作用是将以度为单位的角度转换为以弧度为单位的近似等效角度
返回double型ulp(…d/f):作用是返回参数的ULP大小
参数可以是double d、float f两种,返回对应的类型
ULP我也不是很懂,查了查有这么个解释: 一个单位的最后的地方(浮点数)
我用的其中两组测试数据是这样的:
System.out.println(Math.ulp(10.0));
System.out.println(Math.ulp(100000.0));
输出结果则是:
1.7763568394002505E-15
1.4551915228366852E-11
使用范例
Here
Ending
整理了很久,东西都是自己原创的,希望大家读后尊重劳动成果以及有所收获,蒟蒻表示谢谢
这里很多测试都是jshell完成的,这是个很棒的“工具”,希望大家好好利用!
【Java】浅析Math类相关推荐
- java中立方根方法_java基础:4、java中Math类的常用方法?
4.java中Math类的常用方法? Java的Math类封装了很多与数学有关的属性和方法.如下所示: System.out.println("计算平方根--Math.sqrt(81)-- ...
- java math四舍五入类,Java中Math类的几个四舍五入方法的区别
JAVA取整以及四舍五入 下面来介绍将小数值舍入为整数的几个方法:Math.ceil().Math.floor()和Math.round(). 这三个方法分别遵循下列舍入规则: Math.ceil() ...
- Java,Math类中的ceil、floor和round函数源码解析以及自己重写实现
1. ceil.floor和round的功能 首先,这三个方法都是Math类的静态方法,而且类Math在java.lang包下,所以我们在代码中可以直接调用Math的方法. Math.ceil(dou ...
- JAVA中Math类的random()方法使用
使用了Math类的random()方法, 由于Math类是出于java.lang包(Package),故使用时不必import这个包. 此外本例还使用了移位运算符 /*** 使用了Math类的rand ...
- java中math类的作用_Java开发知识之Java的数字处理类Math类
Java开发知识之Java的数字处理类Math类 一丶Java.text.DecimalFormat类与NumberFormat类 首先 Java.text.DecimalFormat指的是Decim ...
- Java 之 Math类 常用方法详解
Math类是数学工具,它是一个final类 ,不能被继承,也不能被创建对象.它提供的所有属性和方法都是static修饰 ,直接使用类名.方法名/属性来调用.接下来就介绍常用的Math类的方法~ 目录 ...
- [Java基础]Math类的常用方法
Math类的常用方法:
- Java中Math类常用函数总结
Java中比较常用的几个数学公式的总结: //取整,返回小于目标函数的最大整数,如下将会返回-2 Math.floor(-1.8): //取整,返回发育目标数的最小整数 Math.ceil() //四 ...
- java hypot_Java Math类静态double hypot(double d1,double d2)与示例
数学类静态double hypot(double d1,double d2)此方法在java.lang包中可用. 此方法用于返回(square(d1)+ square(d2))的平方根,而无需任何中间 ...
最新文章
- Spring(ApplicationContextBeanFactory)
- java json开发包 fastjson 简介
- leeds计算机科学理学硕士,利兹大学数学及计算机科学理学硕士研究生申请要求及申请材料要求清单...
- 浅析建设企业网站的三大基本类型
- 关于jQuery中的offset()和position()
- (四)为深度伪造预处理数据集
- python中texttable库显示实时数据_python显示数据库数据
- 英特尔玩VR有多认真?看看Project Alloy的细节就知道了
- 共性的缺失——由博客想到的
- spring的依赖注入的方式(待更新)
- echart 世界地图发光_使用echart.js来绘制世界地图
- ❤️❤️固高运动控制卡的相关知识点
- revel + swagger 文档也能互动啦
- linux svn更新到指定版本
- 美国国父乔治华盛顿首任就职演说
- 微博授权登录demo php,php实现新浪微博授权登录
- AD(altium designer)15原理图与PCB设计教程(六)——印制电路板设计的基础知识
- 如何做一个自己的网站?
- 这4大场景正被区块链“残忍屠杀”,15个活生生的例子了解一下?
- linux 5g,5G的时隙配置
热门文章
- 17秋 软件工程 团队第五次作业 Alpha Scrum2
- [Java][web]利用Spring随时随地获得Request和Session
- 使用FindBugs-IDEA插件找到代码中潜在的问题
- iOS开发触摸事件的传递
- linux基础应用和常用技巧
- 业内指路共享软件:更多机会在移动和海外市场(三)
- libsvm java 实例_LibSVM Java API调用示例程序
- python手势识别隐马尔可夫模型_使用隐马尔可夫模型的运动笔迹手势识别.doc
- php框架费尔康,GitHub - majixian/study-phalcon: phalcon(费尔康)框架学习笔记
- 【C语言笔记结构体】