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();
}
我的问题是:
- 为什么Decimal.js 宣传容量最多为 1e+9 位时不计算过去的 504 位?
- 是否有替代节点或 JS API 可以更精确地支持此程序?
1000000000 是 decimal.js precision 设置的最大允许值,但这并不意味着三角函数方法可以 return 结果达到该有效数字位数。
三角函数的精度限制由源代码中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 位的参数的 tan
时程序失败的原因精度超过 500 位。
要做到这一点需要 Pi 更高的精度 - 这只能通过编辑 [ 的值来完成,并且可以简单地完成=11=] 在源代码中,即向其添加更多数字。这些方法所花费的时间将成为限制因素。
我是图书馆的作者,我需要将其添加到其文档中。
我一直在使用 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();
}
我的问题是:
- 为什么Decimal.js 宣传容量最多为 1e+9 位时不计算过去的 504 位?
- 是否有替代节点或 JS API 可以更精确地支持此程序?
1000000000 是 decimal.js precision 设置的最大允许值,但这并不意味着三角函数方法可以 return 结果达到该有效数字位数。
三角函数的精度限制由源代码中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 位的参数的 tan
时程序失败的原因精度超过 500 位。
要做到这一点需要 Pi 更高的精度 - 这只能通过编辑 [ 的值来完成,并且可以简单地完成=11=] 在源代码中,即向其添加更多数字。这些方法所花费的时间将成为限制因素。
我是图书馆的作者,我需要将其添加到其文档中。