2017-02-22 127 views
0

我想计算(A/B)的一些(C/D)根与任意精度为根的十进制扩展(例如,如果期望的精度是整数E,结果应该包含E数字之后的小数点的根; E可能至少等于数以万计; A,B,C,D是包含数十万位小数的整数),但是我发现所有的Javascript数学库都会拒绝处理这些数字。
我试过使用Decimal.js,但是它的输入精度有限且大小有限。例如,如果我想计算的2 1025个显著数字的平方根(其中最后一个数字可能以某种方式四舍五入),我用Decimal.js下面的代码:如何以任意精度计算任意大的整数A,B,C和D的(A/B)的(C/D)根?

Decimal.set({ precision: 1025 }); 
var r2 = Decimal.pow(2, Decimal.div(1, 2)).toDP(1025).toString(); 
console.log(r2); 

,但我得到

Error: [DecimalError] Precision limit exceeded 

是否有可能使用客户端(在浏览器中工作)的Javascript解决问题?据我所知,有一些有效的算法来计算根,即使是数字的百万,但我没有看到任何这些在JS中实现的任意大数量和任意精度。它有可能吗?

+0

'精密:1025':-o – Rajesh

+0

你可能想设置的显示精度的内部工作精度越高,计算链1位,每2或3运算加上缓冲这将在这里给出'Decimal.set({precision:1029});' – LutzL

+0

@LutzL:我不明白...我应该用什么代码来获得1500平方根的数字在Decimal.js中?此外,据我所知,Decimal.js不能处理大于2^1024的整数。 –

回答

0

decimal.js,设置precision1025给你总共1025(尾数)在一个数字的十进制数字。

.toDP(1025)引用小数点后的数字或小数位,在本例中总共需要1026个尾数位,因为在小数点之前有一个数字1

可以假定这些方法使用适当增加的内部工作精度,以便输出相对于舍入是正确的。这意味着如果以更高的精度重新计算,最后一位数字可能不相同。如果要防止这种情况,请将舍入模式设置为round-down(趋近于零)。


电源方法失败,精度比1020大的原因是,内部高精度超过1025,其是给定的一个字符串内部LN10恒定的长度。错误是因为对这种情况的明确测试。

您可能会为此库使用1000位结果作为Newton方法的初始点以获得改进的结果。

my_div = document.getElementById("my_div") 
 
Decimal.set({precision:1010}); 
 
var a = Decimal.pow(new Decimal(2), Decimal.div(1,2)) 
 
my_div.innerHTML += "initial pr=1000 : "+a.toDP(1000); 
 
Decimal.set({precision:2500}); 
 
for(var k=1; k<=4; k++) { 
 
    a = Decimal.div(a.add(Decimal.div(2,a)),2); 
 
    my_div.innerHTML += "<br> Newton "+k+" : "+a; 
 
}
<script src="https://raw.githubusercontent.com/MikeMcl/decimal.js/master/decimal.js"></script> 
 
<div id="my_div"></div>

+0

如何使用小数。js查看sqrt(2)的小数点后面的前1500个十进制数字?无论选择什么精度都无所谓,但是在大约1000位数字后我总会遇到错误。而且,如何处理大于2^1024的数字?例如,尝试使用具有1024个以上二进制数字的新十进制('0b1 ...')将产生一个错误。 –

+0

您不能使用幂函数(也可能是exp和log),其精度大于1020左右,因为它们的代码包含“LN10”常量,该常量只与1025位数字一起提供。您可以使用牛顿来细化多项式根,查看最后的编辑和示例。 – LutzL

+0

据我所知,这种方法依赖于知道权力的派生。我不认为它可以应用于使用decimal.js的大数字。 –