【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,其余兩個返回long
floorMod?(…x, …y):作用是返回小于或等于代數運算所得模的最大(最接近正無窮大)值
參數可以是int+int、long+int、long+long三種
int+int返回int,其余兩個返回long
fma?(…a, …b, …c):作用是返回前兩個數相加后與第三個數相乘得到的值
參數可以是double+double+double、float+float+float兩種,返回對應的類型
getExponent?(…d/f):作用是返回無偏指數
參數可以是double d、float f兩種
返回int
無偏指數的話,可以在這里看一看咯,自行理解:Here
hypot?(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,返回long
multiplyHigh?(long x,long y):作用是作為一個long返回兩個64位因子的128位積中最重要的64位
返回long
negateExact?(…a):作用是返回參數的相反數
參數可以是int、long兩種,返回對應的類型
取相反數后如果溢出會拋出異常
nextAfter?(…start, …direction):作用是返回第二個參數方向上與第一個參數相鄰的浮點數
參數可以是double+double、float+double兩種
返回值隨第一個參數走
這個方法我簡單的解釋一下:我用的其中三組測試數據是這樣的:
輸出結果則是:
1.0000000000000002 1.0000000000000002 0.9999999999999999相信大家自行體會可以明白的
參數可以是double d、float f兩種,返回對應的類型
這個方法我簡單的解釋一下:我用的其中四組測試數據是這樣的:
輸出結果則是:
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參數返回int
scalb?(…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我也不是很懂,查了查有這么個解釋: 一個單位的最后的地方(浮點數)
我用的其中兩組測試數據是這樣的:
輸出結果則是:
1.7763568394002505E-15 1.4551915228366852E-11使用范例
Here
Ending
整理了很久,東西都是自己原創的,希望大家讀后尊重勞動成果以及有所收獲,蒟蒻表示謝謝
這里很多測試都是jshell完成的,這是個很棒的“工具”,希望大家好好利用!
總結
以上是生活随笔為你收集整理的【Java】浅析Math类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用循环队列的思想进行加密解密(洛谷P1
- 下一篇: (四)Go 语言编译流程简述