Decimal.js tan 的精度问题

Precision issue with Decimal.js tan

我一直在使用 Decimal.js 来提高我的函数的精度,该函数通过反复试验计算 a = tan(a) 的第 m 个正根。它有效,但是 return 是 nTan(504) 的 "Precision limit exceeded" 错误(return 4.4934... 到 505 位数字)和更大。

var Decimal = require("decimal.js");
var fs = require("fs");

function nTan (acc, m) {
    var test = [1], acc = (parseInt(acc) || 15) + 1;
    Decimal.set({precision: acc});
    var n = new Decimal(fs.readFileSync("result.txt", "utf-8") || 4.4).toString();

    while (n.length + test.length - 2 < acc) {
        var dec = (new Decimal(n + test.join("")));
        if (dec.tan().cmp(n + test.join("")) >= 0) {
            test[test.length - 1]--;
            test.push(1);
        } else test[test.length - 1]++;

        if (test[test.length - 1] == 10) { test[test.length - 1] = 9; test.push(1); }
    }

    return (new Decimal(n + test.slice(0, -1).join(""))).plus(Math.PI * (parseInt(m) || 0)).toString();
}

我的问题是:

  1. 为什么Decimal.js 宣传容量最多为 1e+9 位时不计算过去的 504 位?
  2. 是否有替代节点或 JS API 可以更精确地支持此程序?

1000000000decimal.js precision 设置的最大允许值,但这并不意味着三角函数方法可以 return 结果达到该有效数字位数。

三角函数的精度限制由源代码中Pi值的精度决定。在decimal.js文件中硬编码为字符串变量PI,精度为1025个数字.

这意味着cossin的精度限制tan 方法最多约 1000 个数字,但实际数字取决于传递给它们的参数的精度。要计算实际数字,请使用

maximum_result_precision = 1000 - argument_precision

例如,以下两个都可以正常工作

Decimal.set({precision: 991}).tan(123456789);

Decimal.set({precision: 9}).tan(991_digit_number);

as,对于每个,结果精度加上参数精度,即 991 + 99 + 991 , 小于或等于 1000.

这就是当您尝试计算超过 500 位的参数的 tan 时程序失败的原因精度超过 500 位。

要做到这一点需要 Pi 更高的精度 - 这只能通过编辑 [ 的值来完成,并且可以简单地完成=11=] 在源代码中,即向其添加更多数字。这些方法所花费的时间将成为限制因素。

我是图书馆的作者,我需要将其添加到其文档中。