Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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!!!

like image 766
bawa g Avatar asked Jan 26 '26 00:01

bawa g


1 Answers

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.

like image 122
Teepeemm Avatar answered Jan 28 '26 14:01

Teepeemm



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!