首页 文章

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

提问于
浏览
0

我想计算(A / B)的一些(C / D)根与 arbitrary precision 的根的十进制扩展(例如,如果所需的精度是整数 E ,结果应该包含根的 E 个数字 after the decimal point ; E 可能等于至少数万; A,B,C,D是包含数万个十进制数字的整数),但我找到的所有Javascript数学库都将拒绝处理这些数字 .
我尝试使用Decimal.js,但它的精度有限且输入的大小有限 . 例如,如果我想计算2的平方根有1025个有效数字(最后一个数字可能以某种方式舍入),我使用以下代码为Decimal.js:

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来解决问题?据我所知,有一些有效的算法来计算根,即使是 millions 的数字,但我没有看到任何这些在JS中实现任意大数和任意精度 . 有可能吗?

1 回答

  • 0

    decimal.js 中,将 precision 设置为 1025 会在一个数字中为您提供总共1025(尾数)的十进制数字 .

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

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


    精确度大于1020的幂方法失败的原因是内部精度超过1025,这是以字符串形式给出的内部 LN10 常量的长度 . 该错误是因为针对这种情况的明确测试 .

    您可能为此库使用1000位数结果作为牛顿方法的初始点以获得改进的结果 .

    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>
    

相关问题