Javascript Decimal.js的精度问题
我一直在使用Decimal.js来提高我的函数的精度,该函数通过反复试验来计算Javascript Decimal.js的精度问题,javascript,node.js,math,bignum,decimal.js,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) +
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();
}
var Decimal=require(“Decimal.js”);
var fs=要求(“fs”);
功能nTan(acc,m){
var检验=[1],acc=(parseInt(acc)| | 15)+1;
Decimal.set({precision:acc});
var n=new Decimal(fs.readFileSync(“result.txt”,“utf-8”)|| 4.4).toString();
而(n.长度+试验长度-2=0){
测试[测试长度-1]-;
试验。推(1);
}else测试[test.length-1]+;
如果(test[test.length-1]==10){test[test.length-1]=9;test.push(1);}
}
返回(新的十进制数(n+test.slice(0,-1).join(“”)).plus(Math.PI*(parseInt(m)| | 0)).toString();
}
我的问题是:
100000000是精度设置允许的最大值,但这并不意味着三角法可以返回该有效位数的结果 三角法精度的极限由源代码中Pi值的精度决定。它在decimal.js文件中硬编码为字符串变量
PI
,精度为1025位数
这意味着cos
、sin
和tan
方法的精度限制约为1000位,但实际数字取决于传递给它们的参数的精度。要计算实际数字,请使用
最大结果精度=1000-参数精度
例如,以下两种方法都可以很好地工作
Decimal.set({precision: 991}).tan(123456789);
Decimal.set({precision: 9}).tan(991_digit_number);
对于每一个,结果精度加上参数精度,即991+9
和9+991
,小于或等于1000
这就是为什么当您尝试将一个大于500位的参数的tan
计算到大于500位的精度时,程序失败的原因
要做到这一点,需要更高精度的Pi——这只能通过在源代码中编辑Pi
的值来实现,也就是说,向其添加更多的数字。这些方法所花费的时间将成为限制因素
我是图书馆的作者,我需要将此添加到其文档中。我不理解您的观点/问题。调用
nTan(504)
时,将精度设置为504位。这里:Decimal.set({precision:acc})
如果我调用nTan(504),Decimal.js会产生“超出精度限制”错误。小于该值的任何值(例如nTan(250))将按预期返回OK。当超过自然对数为10的内部存储字符串的长度时,会在函数getLn10
中引发此错误。在存储库中,这是1024个字符。可能是因为您使用的是旧版本的库,它存储了一个较短的字符串吗?错误表明它来自Decimal.js的tan函数:at…,at nTan,at Decimal.P.tangent.P.tan,at Decimal.P.sine.P.sin,at tolesshanhalfpi,at getPi,at error:[DecimalError]精度限制超过hanks,这很有意义。