问题标签 [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.
math - 一个好的不确定性(区间)算术库?
已编辑
鉴于“不确定”和“不确定性”这两个词相当普遍,很难通过谷歌搜索“不确定性算术”并立即获得任何有用的信息。因此,任何人都可以建议一个好的例程库,在几乎任何编程/脚本语言中,实现对不确定值的处理,按照这个描述:
使用不确定性算术记录近似值,对其有测量公差。这是当我们不确定一个值,但知道它可以具有的上限和下限时,表示为±值。
math - 用于跟踪最坏情况错误的算术库
(已编辑)
是否有任何库或工具可以了解算术运算中的最大累积误差?
例如,如果我进行一些迭代计算...
...我最后不仅想知道计算值,还想知道潜在的错误(如果每个单独操作的结果采用每个操作数的范围限制,则可能值的范围)。
我已经编写了一个名为EADouble.java(错误会计的 EA)的 Java 类,它保存并更新最大正负误差以及计算值,用于一些基本操作,但恐怕我可能正在重新发明一个方轮.
任何库/Java中的任何东西/任何东西?有什么建议么?
- 7 月 11 日更新:检查现有库并添加示例代码链接。
- 正如同仁评论的,有区间算术的概念,并且有一个关于该主题的先前问题(一个好的不确定性(区间)算术库? )。关于我的意图只有几个小问题:
- 我更关心“主要”值而不是上限和下限。但是,为开放库添加额外的价值应该是直截了当的。
- 将误差计入一个独立的浮点数可能允许更精确的精度(例如,对于加法,上限将仅增加一半ULP,而不是整个 ULP)。
- 我看过的图书馆:
- ia_math(Java。只需要添加主要值。到目前为止我最喜欢的)
- Boost/numeric/Interval(C++,非常复杂/完整)
- ErrorProp(Java、帐户值和错误作为标准差)
- 示例代码 ( TestEADouble.java ) 可以运行弹道模拟和数字 e 的计算。然而,这些都不是非常苛刻的场景。
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 行代码一起工作;)
有更好的主意吗?(这会让我很开心......)
javascript - Javascript中的保守区间算术库
Javascript中是否有一个很好的保守区间算术库?
保守的意思是给定两个代表实数范围的区间(其端点恰好是浮点数),它们的区间总和包含原始区间的所有实数总和,对于其他操作也是如此。通过快速搜索找到的唯一库是https://github.com/Jeff-Tian/JavaScriptIntervalArithmetic,但它似乎并不保守。
由于我们无法访问舍入模式,因此如果间隔不是最佳的,那很好(实际上对于速度来说更可取)。例如,如果一个数字的平方保守地近似为 就可以了[(1-epsilon)*(x*x),(1+epsilon)*(x*x)]
,即使这大于最佳浮点间隔。
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 是确切的解决方案。
精确的配方
这是一个在输入系数中没有舍入问题的重新表述,但解决方案仍然只是 -∞...+∞。因此,微不足道的正确,但不可用。
python - 使用 pandas 计算重叠时间范围的持续时间
我有类似于下面示例的大型 csv 流量数据文件,我需要为此计算总字节数和每次数据传输的持续时间。时间范围重叠,但必须合并:
期望的输出:
我目前使用类似以下几行的内容:
calculate_duration 函数(如下)迭代每个组的内容,合并重叠的时间间隔,然后返回一个数据帧,然后将其连接到求和的数据帧 df。
这种方法非常慢,因为它涉及迭代并为每个组调用 apply 方法。
有没有更有效的方法来计算数据传输的持续时间,合并重叠间隔,使用 pandas(以某种方式避免迭代?)最好不求助于 cython?
floating-point - 体素-三角形相交的保守 AABB
我要解决的问题是为三角形和立方体的交集生成 AABB。在 2D 中,所需的体积是此处显示的绿色方块:
输入点和输出边界是 IEEE 浮点数。
我目前使用浮点的方法是将三角形剪辑到体素的每个面上,并绑定生成的多边形。但是,使用浮点意味着交点不精确,因此结果 AABB 可能没有完全限定交点区域。我需要一个保守的界限。
我研究了使用区间算术进行裁剪,但有两个潜在问题:
- 操作链的间隔可能会变大
- 条件取决于区间的分支是一团糟,结果可能不确定,这意味着两种可能性都需要计算。例如。如果(线穿过平面)
有没有更简洁的方法来做到这一点?也许某种方法来计算所需的 epsilon 以抵消最终结果?临时计算双精度并将最终浮点结果偏移 1ULP,希望双精度数学不会累积超过 28 位的错误。如果我能证明这一点,那就太好了。
有理算术可能是另一种选择,但是当输入可以跨越整个浮点范围时,我无法保证有足够的位。
有什么建议么?提前致谢。
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])
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 类型的间隔的联合(向量)来表示。
c++ - 是否有用于 boost::numeric::interval 长度的内置函数
我在我的代码中输入以下内容
令我惊讶的是,我在boost::numeric::interval中找不到一个简单的实用程序来计算长度。我希望有一个长度函数,这样我就可以做到
这是要么
- 由于疏忽而从图书馆失踪
- 有充分的理由从图书馆中丢失,因为它不符合这个概念
- 在那里,但用另一个我没见过的名字
显然我可以编写一个简单的内联函数来做到这一点,但我有点惊讶我必须看到像 min 和 max 这样的函数