我正在尝试在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
我哪里错了?
这是一种合理的方法来处理这种需要高精度浮点的计算吗?
答案 0 :(得分:2)
您应该将字符串传递给BigDecimal
:
var bar = new BigDecimal(Math.exp(foo).toString());
答案 1 :(得分:2)
有一些数学方法可能有用。如果x
是正数且相当大,那么您将采用两个大数的比率,这将降低您的最终精度。相反,你可能会:
1./(1. + e^(-x))
。1.-e^(-x)
,x越大,近似越好(例如,如果x = 100,那么您的误差将在第86位) )。(老实说,在使用它之前应该验证这一点,我只是在这里关闭内存而不是写下任何东西,但如果这看起来很有用,我可以抓一支铅笔......)
答案 2 :(得分:1)
Math.exp仅适用于普通数字,不能在BigDecimals上运行。在继续之前,Math.exp可能会将foo转换为NaN(或类似的东西)。
您应该在BigDecimal类中查找指数方法。我查看了源代码,我认为可以使用BigDecimal.pow方法。