2016-12-07 18 views
-1

我一直在尋找tan(x)的Java數學庫源代碼。 它不在我的JDK 1.8_60文件夾中。什麼是Math.tan(x)的Java庫的源文件算法?

現在我問這裏,因爲我很好奇Math.tan(x)方法中使用的算法/系列。

對於tan(x)使用MacLaurin系列需要很多奇怪的術語才能獲得高達60度的體面精度。對於Sin(x)和Cos(x)使用MacLaurin系列,然後將精度超出90度即可。

+0

http://www.grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/lang/Math.java#Math.tan%28double%29 – SLaks

+0

@ SLaks,如果你看那裏,你會發現它在本地代碼中實現,所以沒有Java實現在那裏看到... – Jesper

+0

@Jesper:想知道他們是什麼意思的'原生'。 。 。看起來我必須查看A&S或數字食譜。 – Trunk

回答

1

Math.tan()只是調用StrictMath.tan(),這是一個原生方法。爲Java

源代碼可以在http://hg.openjdk.java.net/找到

+0

最後一個鏈接表明,對於大多數值,tan(x)通過27級的MacLaurin進行評估。我看到在那個鏈接和我使用的那些鏈接中引用的高階係數存在一些差異。所以我最好檢查一下。 。 。非常感謝鏈接。 – Trunk

+0

由Math.tan(x)的方法中使用的係數爲: T [] = { 3.33333333333334091986e-01, 1.33333333333201242699e-01, 5.39682539762260521377e-02, 2.18694882948595424599e-02, 8.86323982359930005737e-03, 3.59207910759131235356e-03, 1.45620945432529025516e-03, 5.88041240820264096874e-04, 2.46463134818469906812e-04, 7.81794442939557092300e-05, 7.14072491382608190305e-05, -1.85586374855275456654e-05, 2.59073051863633712884e-05, };這些對於高訂單來說是不精確的。一個是錯誤的信號。也許是一個擬合多項式? – Trunk

+0

@Trunk:好的數學程序員很少直接使用Maclaurin系列。這是常見的用它們來得到一個工作的答案全精度,然後使用[切比雪夫多項式(https://en.wikipedia.org/wiki/Chebyshev_polynomials)或類似的降低計算的多項式的項數的東西。我們的想法是在Maclaurin系列中以較大的參數值交換不準確的精度和較小的精度值,從而在所有值和較少的項中獲得更精確的精度。 –

1

通常情況下,實現將使用三角恆等式減少爭論趨近於零像

tan(a+b)= (tan(a)+tan(b))/(1-tan(a)*tan(b)) 
這樣,如果一個硬

這對於b=45°

tan(a+45°) = (1+tan(a))/(1-tan(a)) 

的進一步減少是可能的將切線值編碼爲30°或15°。

人們也可以使用此標識爲一個半角關係,

tan(a) = 2*tan(a/2)/(1-tan(a/2)^2) 

這也允許減少的角度。首先限制到[-45°,45°],然後3個角二分之一,就會達到[-6°,6°]的範圍,其中較低階泰勒多項式將給出足夠好的近似值。

+0

是的。精確的棕褐色數據比計算機長,所以類似這樣的方法必須由三角函數使用。 – Trunk

+0

使用這些2所表達的問題是,黃褐色(X + 45)的精確度成反比的一個術語,(1 - 棕褐色(X))^ 2。 。 。隨着x接近45,這個術語向上移動。 。 。 – Trunk

+0

然後使用tan(45°+ x)= 1/tan(45°-x),或使用通常的半角公式。 – LutzL

相關問題