我一直在使用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();
}
我的问题是:
答案 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
在源代码中,即添加更多数字。这些方法所花费的时间将成为限制因素。
我是图书馆的作者,我需要将其添加到其文档中。