Javascript中的保守区间算术库

时间:2014-04-15 01:45:59

标签: javascript interval-arithmetic

Javascript中保守区间算法是否存在良好的现有库?

保守的意思是给定两个表示实数范围的区间(其端点碰巧是浮点),它们的区间和包含原始区间的所有实数和,以及其他操作的类似。通过快速搜索找到的唯一库是https://github.com/Jeff-Tian/JavaScriptIntervalArithmetic,但它看起来并不保守。

由于我们无法访问舍入模式,因此如果间隔不是最佳的,则它很好(实际上更适合速度)。例如,如果数字的平方由[(1-epsilon)*(x*x),(1+epsilon)*(x*x)]保守地近似,即使这大于最佳浮点间隔,也没有问题。

2 个答案:

答案 0 :(得分:3)

查看https://github.com/maurizzzio/interval-arithmetic,其间隔表示将其与可以表示的下一个/上一个双精度浮点数绑定的浮点数

var Interval = require('interval-arithmetic');

// { lo: 0.3333333333333333, hi: 0.3333333333333333 }
new Interval().singleton(1 / 3); 

// { lo: 0.33333333333333326, hi: 0.33333333333333337 }
new Interval().boundedSingleton(1 / 3);

Typed Arrays现在提供了一种处理产生双精度浮点数的字节的方法,该库修改了该表示here的有效数字的最后一位,并且所有操作都进行了此舍入错误

答案 1 :(得分:0)

我不太确定“保守”是什么意思,但我想添加到 Array 的原型应该比创建自定义对象更快,而你只需要实现你想要的方法。

Array.prototype._interval_plus = function (arr2) {
    return [this[0] + arr2[0], this[1] + arr2[1]];
};
Array.prototype._interval_minus = function (arr2) {
    return [this[0] - arr2[0], this[1] - arr2[1]];
};
Array.prototype._interval_multiply = function (arr2) {
    var ac = this[0] * arr2[0],
        ad = this[0] * arr2[1],
        bc = this[1] * arr2[0],
        bd = this[1] * arr2[1];
    return [Math.min(ac, ad, bc, bd), Math.max(ac, ad, bc, bd)];
};
Array.prototype._interval_divide = function (arr2) {
    var ac, ad, bc, bd;
    if (arr2[0] === 0 || arr2[1] === 0)
        throw new Error('division by zero');
    ac = this[0] / arr2[0],
    ad = this[0] / arr2[1],
    bc = this[1] / arr2[0],
    bd = this[1] / arr2[1];
    return [Math.min(ac, ad, bc, bd), Math.max(ac, ad, bc, bd)];
};
Array.prototype._interval_pow = function (arr2, pow) {
    var ac = this[0] * Math.pow(arr2[0], pow),
        ad = this[0] * Math.pow(arr2[1], pow),
        bc = this[1] * Math.pow(arr2[0], pow),
        bd = this[1] * Math.pow(arr2[1], pow);
    return [Math.min(ac, ad, bc, bd), Math.max(ac, ad, bc, bd)];
};

现在你可以做像

这样的事情了
var x = [ 0  ,  1  ];
    y = [ 0.5,  3.5];
x._interval_plus(y)     // [ 0.5 ,   4.5 ]
 ._interval_multiply(y) // [ 0.25,  15.75]
 ._interval_minus(y)    // [-0.25,  12.25]
 ._interval_pow(y, 2);  // [-3.0625, 150.0625]