Decimal.js tan的精度问题

时间:2017-10-14 11:46:04

标签: javascript node.js math bignum decimal.js

我一直在使用Decimal.js来提高函数的精度,通过反复试验计算a = tan(a)的第m个正根。它有效,但它会返回超过精确度限制" nTan(504)的错误(将返回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可以更精确地支持该程序?

1 个答案:

答案 0 :(得分:2)

1000000000 decimal.js 精度设置的最大允许值,但这并不意味着三角学方法可以将结果返回到该数量有效数字。

三角法的精度限制取决于源代码中 Pi 值的精度。它在 decimal.js 文件中作为字符串变量 PI 进行硬编码,精度为 1025

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

maximum_result_precision = 1000 - argument_precision

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

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

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

as,对于每个,结果精度加上参数精度,即 991 + 9 9 + 991 ,小于或等于<强> 1000

这就是为什么当您尝试计算超过 500 位数且 500 位数的 tan 且精度高于 500 数字。

要做到这一点,需要 Pi 达到更高的精度 - 这只能通过编辑 PI 在源代码中,即添加更多数字。这些方法所花费的时间将成为限制因素。

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