将Javascript中的Math.exp()与BigDecimal一起用于大浮点数

将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为浮点数)

我试图用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为浮点数):

因此,我尝试将
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))
  • 对于大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());