Decimal.js tan的精度问题



我一直在使用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可以更精确地支持此程序

1000000000是小数.js精度设置允许的最大值,但这并不意味着三角法可以返回该数量的有效数字。

三角法精度的极限由源代码中Pi值的精度决定。它在decimal.js文件中被硬编码为字符串变量PI,精度为1025位。

这意味着cossintan方法的精度限制高达约1000位,但实际数字取决于传递给它们的参数的精度。要计算实际数字,请使用

maximum_result_precision=1000-argument_recision

例如,以下两种方法都能很好地进行

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

因为,对于每一个,结果精度加上自变量精度,即991 + 99 + 991,小于或等于1000

这就是为什么当您尝试将一个超过500位数的参数的tan计算到超过

<500>要做到这一点,需要Pi达到更高的精度,而这只能通过编辑源代码中PI的值来完成,也可以简单地完成,即向其添加更多数字。这些方法所花费的时间将是限制因素。

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

最新更新