使用Math.exp for Math.sinh结果的javascript

时间:2016-01-12 12:29:06

标签: javascript math precision

我只是想为Math.sinh here

编写polyfil

是在javascript doppio

中编写jvm所必需的

但问题是Math.sinh(Double.MIN_VALUE)= 4.9E-324的java结果 而在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 fig 注意我必须通过所有边界测试用例!!!

1 个答案:

答案 0 :(得分: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的xnextTerm会立即下溢到0,您只需返回x

从使用Taylor扩展切换到使用Math.exp方面的定义可能最终取决于您的测试用例的内容。