在Javascript中使用Math.exp()和BigDecimal用于大浮点数

时间:2011-09-20 15:38:26

标签: javascript math bigdecimal

我正在尝试在Javascript中执行以下计算:

e^x / (1 + e^x)

其中x是一个长浮点数。

在这种情况下,我要求准确度至少为小数点后10位。

我一直在使用BigDecimal来准确处理浮点数,如The Floating Point Guide所示。

我的第一次尝试:

var foo = new BigDecimal(myVeryLongFloatingPoint)
var bar = Math.exp(foo);
var spam = bar.divide(bar.add(new BigDecimal("1")));

导致错误(其中xxxxx是浮点数):

TypeError: Object xxxxx has no method 'add'

所以我尝试将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(): Not a number: xxxxx

我哪里错了?

这是一种合理的方法来处理这种需要高精度浮点的计算吗?

3 个答案:

答案 0 :(得分:2)

您应该将字符串传递给BigDecimal

var bar = new BigDecimal(Math.exp(foo).toString());

答案 1 :(得分:2)

有一些数学方法可能有用。如果x是正数且相当大,那么您将采用两个大数的比率,这将降低您的最终精度。相反,你可能会:

  1. 请改用1./(1. + e^(-x))
  2. 对于大x,这大约是 1.-e^(-x) ,x越大,近似越好(例如,如果x = 100,那么您的误差将在第86位) )。
  3. (老实说,在使用它之前应该验证这一点,我只是在这里关闭内存而不是写下任何东西,但如果这看起来很有用,我可以抓一支铅笔......)

答案 2 :(得分:1)

Math.exp仅适用于普通数字,不能在BigDecimals上运行。在继续之前,Math.exp可能会将foo转换为NaN(或类似的东西)。

您应该在BigDecimal类中查找指数方法。我查看了源代码,我认为可以使用BigDecimal.pow方法。