Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Decimal.js的精度问题_Javascript_Node.js_Math_Bignum_Decimal.js - Fatal编程技术网

Javascript 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) +

我一直在使用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();
}
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();
}
我的问题是:

  • 为什么Decimal.js在宣传1e+9位及以下的容量时,不计算超过504位的容量
  • 是否有替代节点或JSAPI可以更精确地支持此程序

  • 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,这很有意义。