我只是想为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 注意我必须通过所有边界测试用例!!!
答案 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的x
,nextTerm
会立即下溢到0,您只需返回x
。
从使用Taylor扩展切换到使用Math.exp
方面的定义可能最终取决于您的测试用例的内容。