Questions tagged «floating-point»

用固定的有效数字位数和某个基数的指数表示数字的方法。它们的形式如下 (significantdigits)baseexponent。通常,数字以base = 2(二进制)表示。

17
是否有适用于Python的高质量非线性编程求解器?
我要解决几个具有挑战性的非凸全局优化问题。目前,我使用了MATLAB的Optimization Toolbox(特别是fmincon()使用algorithm = 'sqp'),它非常有效。但是,我的大部分代码是在Python中进行的,我也想在Python中进行优化。是否存在可以与Python绑定竞争的NLP求解器fmincon()?它必须 能够处理非线性等式和不等式约束 不需要用户提供雅可比行列式。 如果不保证全局最优(fmincon()没有),也可以。我正在寻找一种即使在遇到挑战性问题时也可以收敛到局部最优的东西,即使它比慢一些fmincon()。 我尝试了OpenOpt提供的几种求解器,发现它们不如MATLAB的fmincon/sqp。 只是为了强调,我已经有了一个易于处理的公式和一个好的求解器。我的目标仅仅是更改语言,以使工作流程更加简化。 Geoff指出问题的某些特征可能是相关的。他们是: 10-400个决策变量 4-100个多项式相等约束(多项式范围从1到大约8) 有理不等式约束的数量大约等于决策变量数量的两倍 目标函数是决策变量之一 等式约束的雅可比行列是密集的,不等式约束的雅可比行列是密集的。

2
什么时候应该使用log1p和expm1?
我有一个简单的问题,对于Google来说真的很难(除了每位计算机科学家应该知道的有关浮点算术的规范论文之外)。 什么时候应该使用诸如log1p或的功能expm1代替log和exp?什么时候不应该使用它们?这些功能的不同实现在用法上有何不同?

5
是否有可以从符号公式自动生成数字精度浮点C例程的软件?
给定实变量的实函数,是否有可用的软件能够自动生成数字精确代码,以在配备IEEE 754算法的机器上对所有输入进行函数计算? 例如,如果要评估的实函数为: 该软件将考虑灾难性的取消操作,并可能考虑对某些输入集进行输出表查找,以避免计算精度下降。 或者,是否存在可以生成基于纯表的查找例程以高精度计算给定函数的软件?

4
如何可靠地添加大指数项而不会出现溢出错误?
蒙特卡洛马尔可夫链中一个非常普遍的问题涉及计算概率,这些概率是大指数项的和, ea1+ea2+...ea1+ea2+... e^{a_1} + e^{a_2} + ... 其中的各组分可以从非常小的范围内,以非常大的。我的方法是排除最大指数项以便:aaaK:=maxi(ai)K:=maxi(ai)K := \max_{i}(a_{i}) a′=K+log(ea1−K+ea2−K+...)a′=K+log(ea1−K+ea2−K+...)a' =K + log\left( e^{a_1 - K} + e^{a_2 - K } + ... \right) ea′≡ea1+ea2+...ea′≡ea1+ea2+...e^{a'} \equiv e^{a_1} + e^{a_2} + ... 这种做法是合理的,如果所有的元素aaa,如果他们不是很大,但不是一个好主意。当然,较小的元素无论如何都不会对浮点数求和,但是我不确定如何可靠地处理它们。在R代码中,我的方法如下所示: if ( max(abs(a)) > max(a) ) K <- min(a) else K <- max(a) ans <- log(sum(exp(a-K))) + …

10
哪种算法更准确地计算数字排序数组的总和?
给定正数的递增有限序列。以下两种算法中的哪一种更适合计算数字总和?ž1个,ž2,。。。。。žñz1,z2,.....znz_{1} ,z_{2},.....z_{n} s=0; for \ i=1:n s=s + z_{i} ; end 要么: s=0; for \ i=1:n s=s + z_{n-i+1} ; end 在我看来,最好将数字从最大到最小相加,因为误差会越来越小。我们也知道,当我们将一个非常大的数字加到一个非常小的数字上时,近似结果可能就是这个大数字。 它是否正确?还有什么可以说的?

6
分析C ++函数中的数值错误
假设我有一个函数,将多个浮点值(单或双)作为输入,进行一些计算,然后生成输出浮点值(也为单或双)。我主要使用MSVC 2008,但还计划使用MinGW / GCC。我在用C ++编程。 以编程方式测量结果中有多少错误的典型方法是什么?假设我需要使用任意精度库:如果我不关心速度,那么最好的此类库是什么?

1
Logum中的灾难性取消
我正在尝试在相对精度较低的双精度浮点中实现以下功能: logsum(x,y)=log(exp(x)+exp(y))logsum(x,y)=log⁡(exp⁡(x)+exp⁡(y))\mathrm{logsum}(x,y) = \log(\exp(x) + \exp(y)) 这在统计应用程序中被广泛使用以添加在对数空间中表示的概率或概率密度。当然,或都很容易溢出或下溢,这很不好,因为日志空间最初是用来避免下溢的。这是典型的解决方案:exp(x)exp⁡(x)\exp(x)exp(y)exp⁡(y)\exp(y) logsum(x,y)=x+log1p(exp(y−x))logsum(x,y)=x+log1p(exp⁡(y−x))\mathrm{logsum}(x,y) = x + \mathrm{log1p}(\exp(y - x)) Cancellation from y−xy−xy-x does happen, but is mitigated by expexp\exp. Worse by far is when xxx and log1p(exp(y−x))log1p(exp⁡(y−x))\mathrm{log1p}(\exp(y - x)) are close. Here's a relative error plot: The plot is cut off at 10−1410−1410^{-14} to emphasize …

3
是否可以保证BLAS实现提供完全相同的结果?
给定两种不同的BLAS实现,我们可以期望它们进行完全相同的浮点计算并返回相同的结果吗?还是会发生这种情况,例如,一个人将标量积计算为 ,一个人将其计算为 因此可能在IEEE浮点数中给出不同的结果算术?((x1个ÿ1个+ x2ÿ2)+ x3ÿ3)+x4ÿ4((X1个ÿ1个+X2ÿ2)+X3ÿ3)+X4ÿ4 ((x_1y_1 + x_2y_2) + x_3y_3) + x_4y_4 (x1个ÿ1个+ x2ÿ2)+ (x3ÿ3+ x4ÿ4),(X1个ÿ1个+X2ÿ2)+(X3ÿ3+X4ÿ4), (x_1y_1 + x_2y_2) + (x_3y_3 + x_4y_4),

4
当前可用的GPU是否支持双精度浮点运算?
我已经在包含24个Intel Xeon CPU的节点组成的Ubuntu Linux集群上运行了分子动力学(MD)代码GROMACS。我的兴趣点对浮点算术精度有些敏感,因此我不得不以双精度而不是单精度运行GROMACS-尽管双精度的计算成本较高。因此,在群集上,我以双精度方式编译了GROMACS。 我正在考虑购买一些GPU,因为可能会有相对于CPU的加速(“ GPU加速”)。但是,我需要一个可以执行双精度算术的GPU。您知道这样的硬件是否可以在市场上买到吗?一个在GROMACS邮件列表上最近的文章表明,双精度的GPU市场上不能获得: 硬件尚不支持[双精度算术],但AFAIK。 这个Wikipedia页面似乎暗示双精度GPU并不常见,因为它们可能效率不高: Nvidia GPU上的浮点实现大部分符合IEEE标准。但是,并非所有供应商都这样。这对正确性有影响,对于某些科学应用而言,正确性被认为很重要。虽然在CPU上通常可以使用64位浮点值(双精度浮点数),但GPU并不普遍支持这些值。有些GPU架构牺牲了IEEE遵从性,而另一些则完全缺乏双精度。已经进行了一些努力来在GPU上模拟双精度浮点值。但是,速度折衷首先抵消了将计算量卸载到GPU上的任何好处。 此NVIDIA的Tesla页,在图表中引用“峰值双精度浮点性能”,似乎表明,双精度计算可以,其实,做他们的GPU(虽然在更高的计算成本)。 那么,我应该相信什么?您对此问题有经验吗?


7
浮点数中两个数字的均值的稳健计算?
设x,y是两个浮点数。什么是计算均值的正确方法? 天真的方法(x+y)/2会在x和y太大时导致溢出。我认为0.5 * x + 0.5 * y可能更好,但是它涉及两个乘法(可能效率不高),我不确定它是否足够好。有没有更好的办法? 我一直在玩的另一个想法是(y/2)(1 + x/y)if x<=y。但是,我不确定如何对此进行分析并证明它满足我的要求。 此外,我需要保证计算的均值将为>= min(x,y)和<= max(x,y)。正如唐·哈奇(Don Hatch)的回答所指出的那样,提出这个问题的一种更好的方法可能是:两个数字均值的实现是什么,总是能给出最准确的结果?也就是说,如果x和y是浮点数,如何计算最接近的浮点数(x+y)/2?在这种情况下,计算的平均值将自动为>= min(x,y)和<= max(x,y)。有关详细信息,请参见Don Hatch的答案。 注意:我的首要任务是确保准确性。效率是消耗性的。但是,如果有许多健壮且准确的算法,我会选择最有效的算法。

1
如何避免python函数中的灾难性取消?
我无法在数字上实现函数。它受到以下事实的困扰:在较大的输入值下,结果是很大的数乘以很小的数。我不确定灾难性取消是否是正确的术语,因此请纠正我。出现问题的证据: 对于6的较大输入,如何避免振荡和0.0的赋值? 这是我的功能: import numpy as np def func(x): t = np.exp(-np.pi*x) return 1/t*(1-np.sqrt(1-t**2))

4
在浮点算术中,为什么数字不精确度是通过将一个小项与一个大项之差相加而导致的?
我一直在阅读Allen和Tildesley撰写的《液体的计算机模拟》一书。从第71页开始,作者讨论了用于将牛顿运动方程式集成到分子动力学(MD)模拟中的各种算法。从第78页开始,作者讨论了Verlet算法,这也许是MD中的规范集成算法。他们声明: 也许最广泛使用的积分运动方程的方法是Verlet(1967)最初采用并归因于Stormer(Gear 1971)的方法。此方法的第二阶方程的直接溶液。该方法是基于志愿服务岗位- [R (吨),加速度一个(吨),以及位置- [R (吨- δ 吨)从前面的步骤。推进位置的等式如下:米一世[R¨一世= f一世mir¨i=fim_i \ddot{\textbf{r}}_i = \textbf{f}_i[R (吨)r(t)\textbf{r}(t)a(吨)a(t)\textbf{a}(t)[R(吨-δŤ )r(t−δt)\textbf{r}(t - \delta t) r(t+δ吨)= 2 - [R (吨)- [R (吨- δt )+ δŤ2一个(t)。(3.14)(3.14)r(t+δt)=2r(t)−r(t−δt)+δt2a(t).\tag{3.14}\textbf{r}(t + \delta t) = 2\textbf{r}(t) - \textbf{r}(t - \delta t) + \delta t^2 \textbf{a}(t). 关于eqn(3.14),有几点要注意。可以看出,速度根本没有出现。通过添加关于泰勒展开式获得的方程式已消除了它们:[R (吨)r(t)\textbf{r}(t) r(t+δt )= r(t )+ δ吨v(吨)+ (1 …

4
库功能的FLOP计数
当用一个简单的函数评估FLOP的数量时,通常只需按基本算术运算符就可以了。但是,在涉及偶数除法的数学语句的情况下,不能做到这一点,并且希望能够与仅具有加法和乘法功能的FLOP计数进行比较。当在库中执行该操作时,情况甚至更糟。因此,必须对特殊功能的性能有一些合理的认识。 通过特殊功能,我们的意思是: exp() sqrt() sin / cos / tan() 通常由系统库提供。 确定它们的复杂性的进一步困惑在于,它们中的许多是自适应的并且具有依赖于输入的复杂性。例如,exp()的数字稳定实现通常会自适应地重新缩放并使用查找。我最初的印象是,在这种情况下最好的方法是确定函数的平均行为。 当然,整个讨论高度依赖于体系结构。在此讨论中,我们可以将自己局限于传统的通用体系结构,并排除具有特殊功能单元(GPU等)的那些体系结构。 为了系统与系统之间的比较,人们可以找到相当简单的尝试来针对特定体系结构进行标准化,但是如果人们在乎方法与方法的性能,这是不可接受的。确定这些功能的FLOP复杂度的哪些方法被认为可以接受?有什么大陷阱吗?

1
有改进的计算
大多数数学库都有许多对数函数版本。在大多数情况下,我们认为它们是完美的,但实际上很多它们只是提供了一定数量的精度。 对于某些功能,在数值上更稳定。例如,Fortran,R,Java和C都具有Math.log1p用于计算log(1.0+x)(对于较小的x值可提供更高的精度)和对应的expm1。此处的数字问题是由于精度降低而引起的-如果精度x很小,则会1.0 + x丢失数字以保留开头的1。 在许多情况下,我已经看到了此类功能以提高精度。每当您以较高的数字精度实现分布函数(Gamma,Beta,泊松等)时,这似乎都是很常见的。例如,伽玛函数似乎大部分时间都用作logGamma。通常,转到“ logspace”可以大大提高精度,因此R似乎在大多数函数上都有一个“ logspace”标志。 R中的另一个示例存在log1mexp于log(1 - exp(p)):http : //cran.r-project.org/web/packages/Rmpfr/vignettes/log1mexp-note.pdf 我一直在研究熵和信息理论方法。有一个很普通的名词 p * -log(p) 通常情况下,人们希望对数的底数是2,而不是e;但这通常只是一个线性因素,您也可以使用自然对数(因此这对我而言并不重要)。无论如何,您是否知道该术语是否有更快/更直接/更精确的计算方式?我到处都有它,因此它可以真正使它更加精确和快速地获得回报(感谢我节省了通常的“过早优化”工作)。 我看不出任何会导致精度下降的明显原因。因此,我最感兴趣的是是否有任何不错的技巧可以加快计算速度。这甚至可以省去我处理p=0极端情况的可能性(明智的是0,虽然log(0)不存在),或者免费给我以2为基数(尽管单次乘以常数显然并不昂贵)。谢谢。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.