我一直在使用Decimal.js来提高我的函数的精度,该函数通过反复尝试计算a = tan(a)的正根。它工作,但它返回一个“精度限制超过”错误的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();
}我的问题是:
发布于 2018-01-13 18:58:58
1000000000是decimal.js 精度设置的最大允许值,但这并不意味着三角函数方法可以将结果返回到该数目的有效数字。
三角法的精度是由源代码中的Pi值的精度决定的。它作为字符串变量PI,在decimal.js文件中进行硬编码,其精度为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);对于每个结果,结果精度加上参数精度,即991 + 9和9 + 991,小于或等于1000。
这就是为什么您的程序在尝试计算参数的tan时失败的原因,该参数的数值超过500数字,精度超过500数字。
要做到这一点,需要Pi达到更高的精度--这只能通过编辑源代码中的值,即向其添加更多的数字来完成,而且可以简单地完成。这些方法所花费的时间将是限制因素。
我是图书馆的作者,我需要将这一点添加到它的文档中。
https://stackoverflow.com/questions/46744170
复制相似问题