2014-04-15 61 views
2

Javascript中保守區間算術是否存在良好的存在庫?Javascript中的保守區間算術庫

保守我的意思是,給定兩個代表實數範圍(其端點碰巧是浮點)的區間,它們的區間和包含來自原始區間的所有實數的總和,並且對於其他操作類似。通過快速搜索找到的唯一的圖書館是https://github.com/Jeff-Tian/JavaScriptIntervalArithmetic,但它似乎並不保守。

由於我們無法使用舍入模式,所以如果間隔不是最優的,那麼它很好(實際上更適合速度)。例如,如果數字的平方值保守地近似爲[(1-epsilon)*(x*x),(1+epsilon)*(x*x)],即使這大於最佳浮點間隔,也可以。

+0

'區間和包含實數的所有和'在任何兩個實數之間有無限多的實數,所以這總是_Infinity_,不是? –

+1

@ PaulS.--是的,沒有。 – RobG

+0

@PaulS:這可能有助於思考「保守整數算術」的更簡單的例子。例如,在保守整數運算中[2,10]/[3,3] = [0,4],因爲非整數邊界向外舍入([2/3,10/3]不是整數間隔)。 –

回答

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和所有操作都帶有這個舍入誤差

0

我不太清楚「保守」是什麼意思,但我想添加到原型數組應該比創建自定義對象更快,而且您只需要實現所需的方法。

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] 
+1

這可能對速度有所幫助,但與保守性問題完全正交。 –