问题标签 [interval-arithmetic]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
7 回答
1991 浏览

math - 一个好的不确定性(区间)算术库?

已编辑

鉴于“不确定”和“不确定性”这两个词相当普遍,很难通过谷歌搜索“不确定性算术”并立即获得任何有用的信息。因此,任何人都可以建议一个好的例程库,在几乎任何编程/脚本语言中,实现对不确定值的处理,按照这个描述:

使用不确定性算术记录近似值,对其有测量公差。这是当我们不确定一个值,但知道它可以具有的上限和下限时,表示为±值。

0 投票
1 回答
204 浏览

math - 用于跟踪最坏情况错误的算术库

(已编辑)
是否有任何库或工具可以了解算术运算中的最大累积误差?

例如,如果我进行一些迭代计算...

...我最后不仅想知道计算值,还想知道潜在的错误(如果每个单独操作的结果采用每个操作数的范围限制,则可能值的范围)。

我已经编写了一个名为EADouble.java(错误会计的 EA)的 Java 类,它保存并更新最大正负误差以及计算值,用于一些基本操作,但恐怕我可能正在重新发明一个方轮.

任何库/Java中的任何东西/任何东西?有什么建议么?


  • 7 月 11 日更新:检查现有库并添加示例代码链接。
  • 正如同仁评论的,有区间算术的概念,并且有一个关于该主题的先前问题(一个好的不确定性(区间)算术库? )。关于我的意图只有几个小问题:
    • 我更关心“主要”值而不是上限和下限。但是,为开放库添加额外的价值应该是直截了当的。
    • 将误差计入一个独立的浮点数可能允许更精确的精度(例如,对于加法,上限将仅增加一半ULP,而不是整个 ULP)。
  • 我看过的图书馆:
  • 示例代码 ( TestEADouble.java ) 可以运行弹道模拟和数字 e 的计算。然而,这些都不是非常苛刻的场景。
0 投票
3 回答
2542 浏览

c - memcpy [or not?] 和多线程 [std::thread from c++11]

我用 C/C++ 编写了一个软件,使用了很多 BIAS/Profil,一个区间代数库。在我的算法中,我有一个主控,它划分一个域并将它的一部分提供给从属进程。那些返回关于这些域部分的 int 法规。有共同的数据可供阅读,仅此而已。

我需要并行化我的代码,但是只要 2 个从属线程正在运行(或者我猜想更多)并且都在调用这个库的函数,它就会出现段错误。这些段错误的特殊之处在于,gdb 很少从两个构建中指示相同的错误行:它取决于线程的速度,如果一个更早开始,等等。我尝试让线程屈服,直到从主人,它“稳定”了错误。我相当确定它来自对库的 memcpy 的调用(在 gdb 回溯之后,我总是以调用 memcpy 的 BIAS/Profil 函数结束。公平地说,几乎所有函数都临时调用 memcpy返回结果之前的对象...)。从我在网上阅读的内容来看,memcpy() 似乎不是线程安全的,)。(对于一个应该只读取共享数据的函数来说似乎很奇怪......或者在编写线程数据时,两个线程都使用相同的内存空间?)

为了解决这个问题,我想“替换”(至少用于测试行为是否发生变化)对 memcpy 的调用以进行互斥体框架调用。(类似于 mtx.lock();mempcy(...);mtx.unlock();)

第一个问题:我根本不是开发/代码工程师,并且缺乏很多基础知识。我认为当我使用预构建的 BIAS/Profil 库时,调用的 memcpy 是构建库的系统之一,对吗?如果是这样,如果我尝试从系统上的源代码构建库,它会改变什么吗?(我不确定我是否可以构建这个库,因此提出了这个问题。)

第二个问题:在我的 string.h 中,memcpy 由以下方式声明: #ifndef __HAVE_ARCH_MEMCPY extern void * memcpy(void *,const void *,__kernel_size_t); #endif并且在其他一些字符串头文件(string_64.h,string_32.h)中,定义了以下形式:#define memcpy(dst, src, len) __inline_memcpy((dst), (src), (len))或更明确的定义,或者只是像引用的声明一样的声明。它开始变得丑陋,但理想情况下,我想创建一个预处理器变量#define __HAVE_ARCH_MEMCPY 1,以及一个void * memcpy(void *,const void *,__kernel_size_t)可以使用被解雇的 memcpy 执行互斥框架的 memcpy。这里的想法是避免弄乱库并使其与 3 行代码一起工作;)

有更好的主意吗?(这会让我很开心......)

0 投票
2 回答
668 浏览

javascript - Javascript中的保守区间算术库

Javascript中是否有一个很好的保守区间算术库?

保守的意思是给定两个代表实数范围的区间(其端点恰好是浮点数),它们的区间总和包含原始区间的所有实数总和,对于其他操作也是如此。通过快速搜索找到的唯一库是https://github.com/Jeff-Tian/JavaScriptIntervalArithmetic,但它似乎并不保守。

由于我们无法访问舍入模式,因此如果间隔不是最佳的,那很好(实际上对于速度来说更可取)。例如,如果一个数字的平方保守地近似为 就可以了[(1-epsilon)*(x*x),(1+epsilon)*(x*x)],即使这大于最佳浮点间隔。

0 投票
1 回答
202 浏览

prolog - lib(ic) 的精确解决方案

使用 ECLiPSe Prolog,lib(ic)我偶然发现了David H. Bailey 提出的以下问题,“解决科学计算中的数值异常”。Unum book提到了我。实际上,这只是其中的一部分。首先,让我根据 来制定方程(is)/2另外,请注意,所有这些十进制数字都以基数 2 浮点数(包括 IEEE)精确表示

所以这确实是0.0(根本没有四舍五入)。但现在与$=代替is

此区间不包含 0.0。我知道区间算术通常有点过于近似,如下所示:

但至少等式成立!但是,在第一种情况下,不再包括零。显然我没有理解一些东西。我也尝试过eval/1,但无济于事。

Null不包括的原因是什么0.0


(在@jschimpf 出人意料的回答之后编辑)

这是书中第 187 页的引文,我将其解释为数字被精确表示(现在划线)。

使用可以模拟 IEEE精度的 {3,5} 环境。输入值是完全可表示的。...
{-1, 2}
...完成了
这项工作,用不到...

否则,第 184 页的声明成立:

...

0.80143857 x + 1.65707065 y = 2.51270273

这些方程式当然看起来很无辜。假设精确的十进制输入,该
系统由x = -1 和y = 2 精确求解。

这是用 SICStus 重新检查的library(clpq)

所以 -1, 2 是确切的解决方案。


精确的配方

这是一个在输入系数中没有舍入问题的重新表述,但解决方案仍然只是 -∞...+∞。因此,微不足道的正确,但不可用。

0 投票
2 回答
2288 浏览

python - 使用 pandas 计算重叠时间范围的持续时间

我有类似于下面示例的大型 csv 流量数据文件,我需要为此计算总字节数和每次数据传输的持续时间。时间范围重叠,但必须合并:

期望的输出:

我目前使用类似以下几行的内容:

calculate_duration 函数(如下)迭代每个组的内容,合并重叠的时间间隔,然后返回一个数据帧,然后将其连接到求和的数据帧 df。

这种方法非常慢,因为它涉及迭代并为每个组调用 apply 方法。

有没有更有效的方法来计算数据传输的持续时间,合并重叠间隔,使用 pandas(以某种方式避免迭代?)最好不求助于 cython?

0 投票
0 回答
182 浏览

floating-point - 体素-三角形相交的保守 AABB

我要解决的问题是为三角形和立方体的交集生成 AABB。在 2D 中,所需的体积是此处显示的绿色方块: 在此处输入图像描述

输入点和输出边界是 IEEE 浮点数。

我目前使用浮点的方法是将三角形剪辑到体素的每个面上,并绑定生成的多边形。但是,使用浮点意味着交点不精确,因此结果 AABB 可能没有完全限定交点区域。我需要一个保守的界限。

我研究了使用区间算术进行裁剪,但有两个潜在问题:

  • 操作链的间隔可能会变大
  • 条件取决于区间的分支是一团糟,结果可能不确定,这意味着两种可能性都需要计算。例如。如果(线穿过平面)

有没有更简洁的方法来做到这一点?也许某种方法来计算所需的 epsilon 以抵消最终结果?临时计算双精度并将最终浮点结果偏移 1ULP,希望双精度数学不会累积超过 28 位的错误。如果我能证明这一点,那就太好了。

有理算术可能是另一种选择,但是当输入可以跨越整个浮点范围时,我无法保证有足够的位。

有什么建议么?提前致谢。

0 投票
1 回答
96 浏览

floating-point - Isabelle 中的浮点和区间算术

我在 Isabelle 中使用 Decision_Procs 文件中的 Approximation.thy 进行区间算术。该文件为您提供了一种证明实数不等式的策略,例如:

现在,我有兴趣尝试似乎是 approx 函数的实现的核心功能。这在 Isabelle/HOL 中通过计算证明实值不等式的第 4.5.2 节中进行了描述。以下是我所做的一些陈述:

首先,我想问你是否知道一种更方便的方式来编写浮点数(而不是 Float ab,也许有一种函数real_to_float r)。然后,您会看到该函数在给定一些精度(我将其理解为正确小数位数)的情况下计算作为第二个参数给出的操作的上限和下限。

现在,主要问题如下:

  • 最后一个参数的目的是什么?我猜它们是第二个参数中变量的置信区间?

  • 文中声称该函数还实现了区间算术。你能举一个例子,我可以看到这个函数是如何执行间隔加法的吗?([a,b]+[c,d]=[a+c,b+d])

0 投票
1 回答
181 浏览

c++ - 用于在 2 个有符号整数区间之间进行除法的 C++ 算法

考虑区间 A = [x1, y1] 和 B = [x2, y2],这两个区间表示有符号整数。

维基百科上的区间算术页面给出了一个公式来解决B不包含0的情况,其C++实现可能如下:

输出:

正如预期的那样,鉴于 B 包含 0,结果是不正确的。例如,由于 1 是 B 的一部分,因此 150000 应该在 A/B 内,但不是。

当从 B 中排除 0 时,什么是可行的算法?解决方案是否应该在 -1 和 1 附近使用多个间隔(即排除 0)并以某种方式加入它们?

编辑:解决方案可以用 long long 类型的间隔的联合(向量)来表示。

0 投票
1 回答
43 浏览

c++ - 是否有用于 boost::numeric::interval 长度的内置函数

我在我的代码中输入以下内容

令我惊讶的是,我在boost::numeric::interval中找不到一个简单的实用程序来计算长度。我希望有一个长度函数,这样我就可以做到

这是要么

  • 由于疏忽而从图书馆失踪
  • 有充分的理由从图书馆中丢失,因为它不符合这个概念
  • 在那里,但用另一个我没见过的名字

显然我可以编写一个简单的内联函数来做到这一点,但我有点惊讶我必须看到像 min 和 max 这样的函数