owais
owais

Reputation: 4922

javascript using Math.exp for Math.sinh results

I was just trying to write polyfil for Math.sinh here

which is required for writing jvm in javascript doppio

but problem is java result for Math.sinh(Double.MIN_VALUE) = 4.9E-324 while in javascript its 0 because i am using polyfil and it requires Math.exp(4.9E-324).

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

First javascript turns 4.9E-324 into 5E-324 secondly Math.exp(4.9E-324) or Math.pow(Math.E, 4.9E-324) results in 1 which then results in (1-1)/2 and that is 0 :) Also Number.MIN_VALUE in JS is 5E-324 which equates to 4.9E-324 in Double.MIN_VALUE.

Is there any way so that i can avoid math.exp or Math.pow or to handle precision. I have looked at bigdecimal library which is also not working Is there any other way to handle sig fig Note i have to pass all boundary test cases!!!

Upvotes: 3

Views: 136

Answers (1)

Teepeemm
Teepeemm

Reputation: 4508

The Taylor expansion of sinh(x) is x+x^3/3!+x^5/5!+x^7/7!+. . . . This converges for all values of x, but will converge fastest (and give the best results) for x close to 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;
}

For x less than 1E-108, nextTerm will immediately underflow to 0, and you'll just get x back.

Where you switch from using the Taylor expansion to using the definition in terms of Math.exp may end up depending on what your test cases are looking at.

Upvotes: 1

Related Questions