2016-01-12 21 views
3

我只是試着寫polyfil爲Math.sinh hereJavaScript的使用Math.exp爲Math.sinh導致

這是需要在JavaScript doppio

但問題寫JVM是數學Java結果。 sinh(Double.MIN_VALUE)= 4.9E-324 而在JavaScript中它的0因爲我使用polyfil,它需要Math.exp(4.9E-324)。

(Math.exp(x) - Math.exp(-x))/2; 

第一個JavaScript接通4.9E-324到5E-324其次Math.exp(4.9E-324)或Math.pow(Math.E,4.9E-324)得到1,其隨後導致( 1-1)/ 2,即0 :) JS中的Number.MIN_VALUE也是5E-324,相當於Double.MIN_VALUE中的4.9E-324。

是否有任何方法可以避免math.exp或Math.pow或處理精度。我看了一下也是不起作用的bigdecimal庫 有沒有其他方法可以處理sig注意我必須通過所有的邊界測試用例!

回答

1

sinh(x)的泰勒展開式是x + x^3/3!+ x^5/5!+ x^7/7!+。 。 。 。這對於收斂所有x的值,但將收斂速度最快的(和提供最好的結果)對於x接近0

function mySinh(x) { 
    var returning = x, 
     xToN = x, 
     factorial = 1, 
     index = 1, 
     nextTerm = 1; 
    while (nextTerm != 0) { 
     index++; 
     factorial *= index; 
     index++; 
     factorial *= index; 
     xToN *= x*x; 
     nextTerm = xToN/factorial; 
     returning += nextTerm; 
    } 
    return returning; 
} 

對於除1E-108,nextTerm會立刻溢到0少x,和你」我只會得到x回來。

如果您從使用泰勒展開到根據Math.exp使用定義,可能會最終取決於您的測試用例在看什麼。

+0

謝謝,我在這裏發現了同樣的東西 http://www.johndcook.com/blog/cpp_expm1/ – owaishanif786

相關問題