对于任意大整数A,B,C和D,如何计算(A / B)任意精度的(C / D)根?

时间:2017-02-22 06:05:55

标签: javascript algorithm math numbers

我想计算(A / B)的一些(C / D)根(任意精度)用于根的十进制扩展(例如,如果所需的精度是一个整数{ {1}},结果应包含根后小数点后的E位数; E可能至少等于数万; A,B,C ,D是包含数万个十进制数字的整数),但我找到的所有Javascript数学库都拒绝处理这些数字。
我尝试使用Decimal.js,但它的精度有限且输入的大小有限。例如,如果我想用1025个有效数字计算2的平方根(其中最后一个数字可能以某种方式舍入),我使用以下代码来表示Decimal.js:

E

但我得到

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

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

1 个答案:

答案 0 :(得分:0)

decimal.js中的

,将precision设置为1025会在一个数字中为您提供总共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;
}
&#13;
<script src="https://raw.githubusercontent.com/MikeMcl/decimal.js/master/decimal.js"></script>
<div id="my_div"></div>
&#13;
&#13;
&#13;