我想计算(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中实现的任意大数和任意精度。它有可能吗?
答案 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;