将Javascript中的Math.exp()与BigDecimal一起用于大浮点数
我试图用Javascript执行以下计算:将Javascript中的Math.exp()与BigDecimal一起用于大浮点数,javascript,math,bigdecimal,Javascript,Math,Bigdecimal,我试图用Javascript执行以下计算: e^x / (1 + e^x) 其中,x是一个长浮点数 在这种情况下,我要求精度至少达到小数点后10位 我一直在使用,以准确地处理浮点数,如在 我的第一次尝试: var foo = new BigDecimal(myVeryLongFloatingPoint) var bar = Math.exp(foo); var spam = bar.divide(bar.add(new BigDecimal("1"))); 导致错误(其中xxxxx为浮点数)
e^x / (1 + e^x)
其中,x
是一个长浮点数
在这种情况下,我要求精度至少达到小数点后10位
我一直在使用,以准确地处理浮点数,如在
我的第一次尝试:
var foo = new BigDecimal(myVeryLongFloatingPoint)
var bar = Math.exp(foo);
var spam = bar.divide(bar.add(new BigDecimal("1")));
导致错误(其中xxxxx为浮点数):
因此,我尝试将bar
转换为BigDecimal对象:
var foo = new BigDecimal(myVeryLongFloatingPoint)
var bar = new BigDecimal(Math.exp(foo));
var spam = bar.divide(bar.add(new BigDecimal("1")));
从而导致错误(其中xxxxx是浮点数):
我哪里做错了
对于需要高精度的浮点运算,这是一种明智的处理方法吗?您应该将字符串传递给
BigDecimal
:
var bar = new BigDecimal(Math.exp(foo).toString());
Math.exp仅适用于普通数字,不能对大小数进行运算。在继续之前,Math.exp可能正在将foo转换为NaN(或类似的东西)
您应该在BigDecimal类中查找求幂方法。我查看了源代码,我认为可以使用BigDecimal.pow方法来代替。有一些数学方法可能有用。如果
x
为正且相当大,则取两个大数字的比率,这将降低最终精度。相反,您可以:
1./(1.+e^(-x))
1.-e^(-x)
,并且x越大,近似值越高(例如,如果x=100,那么您的误差将在第86位)(老实说,在使用它之前应该先验证一下,我只是离开了内存,没有写任何东西,但如果这看起来有用,我可以拿一支铅笔…使用常规(二进制)浮动有什么问题?如果是因为溢出,为什么不将表达式重写为等价形式
1/(1+e^-x)
,并将其用于正x
?谢谢,我将玩一下。谢谢-这为我解决了这个问题。
BigDecimal(): Not a number: xxxxx
var bar = new BigDecimal(Math.exp(foo).toString());