- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
expm1“函数避免了直接评估小 x 的 exp(x)-1 时涉及的精度损失。”
关于什么是小,是否有经验法则? 1e-1、1e-10、1e-100 ?(side Q:有没有性能或其他原因不总是使用expm1?)
np.info(np.expm1)
Examples
--------
The true value of ``exp(1e-10) - 1`` is ``1.00000000005e-10`` to
about 32 significant digits. This example shows the superiority of
expm1 in this case.
>>> np.expm1(1e-10)
1.00000000005e-10
>>> np.exp(1e-10) - 1
1.000000082740371e-10
最佳答案
如果 6 位有效的小数位对您来说足够了,exp(x)-1
就可以了,直到 x 为 1e-10。通常,当 x 约为 10**(-N)
时,您将失去 N 位小数的精度。我们从大约 16 位 double 字开始。
为什么不总是使用expm1
?因为 expm1(x) + 1
与 exp(x)
相比绝对没有优势,无论 x
有多小。只有当您的计算实际上需要类似 exp(x) - 1
的东西时,才有意义使用 expm1
。必须考虑更广泛的计算上下文。
这并不是关于 x 有多小,而是关于如何在您的计算中使用 exp(x)
。 expm1
的目的应该在更广泛的 Loss of significance 上下文中理解.有些公式在某些参数范围内可能会失去意义;必须分析公式以查看它是否以及何时发生。如果在某个范围内可能失去显着性,请将公式重新编写为代数等价但数值稳定的东西。维基百科用二次方程的例子很好地解释了这一点。
如果您的目标是计算 exp(x)
或 3*exp(x) + 4
等,您应该使用 exp
。这里没有失去意义,将 expm1
放在这样的公式中也没有任何好处,无论 x
有多小。写 expm1(x) + 1
而不是 exp(x)
是完全没有意义的。
如果您的公式是 exp(x) - 1
或 exp(x) - cos(x)
,那么小的 可能会失去意义x
。这并不总是重写的理由;如果您只打算在 x 等于或大于 1 时使用此公式,则没有问题。如果您可以接受处于机器 epsilon 级别(1e-16 左右)的绝对错误,并且不太关心相对 错误,则没有问题。
当发生重要性损失时,由信息的最终用户决定可以接受多少损失。通常,获得 6 位有效数字对于实际用途来说已经足够了,因此失去 double 精度的 10 位十进制数字可能是可以接受的。在此上下文中,当 x
小于 1e-10
时,公式 exp(x) - 1
会导致 Not Acceptable 精度损失。事实上,exp(x) - 1
的值接近于 x
但 exp(x)
看起来像 1.00000000... 有 10 个数字点为0后;所以 x 本身只剩下 6 位数字。
以数字上更安全的形式重写函数需要一些人工努力,以计算出所需的任何代数或三角恒等式。这种重写的例子:
f = lambda x: np.exp(x) - np.cos(x)
g = lambda x: np.sqrt(x**2 + 1) - 1
上面的数字更安全的形式:
f_safe = lambda x: np.expm1(x) + 2*np.sin(x/2)**2
g_safe = lambda x: x / (np.sqrt(x**2 + 1) + 1)
重写 np.exp(x) - np.cos(x)
为 np.expmp(x) - np.cos(x) + 1
没有完全受益;必须仔细考虑整个计算,以消除几乎相等数字的减法。
关于python - 何时使用 python 函数 expm1 而不是 exp-1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47725508/
如果我在 sympy 中使用 simplify() 函数,log((exp(x)+1)/exp(x)) 会简化为 log (1+exp(-x)),但是,当我阅读文档时,简化函数“可能会不必要地慢”,我
我正在创建一个 Validator类(class)。我正在尝试实现 Linq SelectMany我的验证器的扩展方法能够使用 Linq 查询组合表达式并验证最终结果,即使基础值发生变化也是如此。 下
我正在尝试编写一个程序来计算 exp(-x) 和 exp(x) 的泰勒级数最多 200 次迭代,对于大 x。 (exp(x)=1+x+x^2/2+...). 我的程序非常简单,看起来应该可以完美运行。
我正在看书,看到这段代码: public Animal getWinner(List animals) { return animals == null || animals.size() =
我正在将脚本从 matlab 复制到 C++ 函数中。但是,对于 exp 函数,我不断得到不同的结果。例如,以下片段: std::complex final_b = std::exp(std::com
我不太了解 Python,但下面的代码片段结果是 0.367879441171 from math import exp window = 10000 td = 1 print exp(-td/win
为什么/何时使用其中一种?我刚刚遇到了一个问题,我在使用一个时收到警告,而在使用另一个时没有警告。 例子: tableView.tableHeaderView = label; // worked [
这个问题在这里已经有了答案: java.lang.Math.log replaced by intrinsic call, why not java.lang.Math.exp()? (1 个回答)
我正在将一些 Python 代码转换为 C 代码。 下面的复数输出上的 Python NumPy exp (6.12323399574e-17-1j) 为 k=1、l=4。 numpy.exp(-2.
我正在尝试学习或生成任何代码来学习字符串day("26.02.2009") --->给我“星期三” 我需要C#中的静态datefunction。 例如: datetime Str_day= Retur
[编辑:整个事情有一个非常简单的解决方案:矩阵使用单数据类型而不是默认的双数据类型] 我刚刚注意到 matlab 中的一个有点奇怪的(我认为)行为,想知道是什么导致了它。我有一个 10000x500
我创建了一个运行良好的网站,但我想添加干净的 url,如 exp.com/sec1 而不是 exp.com/#sec1,我有点用 History.pushState 实现了它,但是当有人重新加载链接将
我目前正在听一个关于自动语音识别 (ASR) 的讲座。最后一讲是关于矢量量化(VQ)和k最近邻(kNN)以及二叉树和高斯混合模型(GMMs)。 据讲师介绍,VQ只是通过计算GMM的一个近似值来加速GM
在 oracle 中,我们有 exp效用。我们将其用作 exp username/password@database .这里我们可以使用提供主机和端口详细信息来导出到远程数据库表吗?如果是,提供这些的
如何使用 at-exp 来包含 blew 原始字符串: package foo } import ( 我是这样写的,但是不能包含“}”字符: #lang at-exp racket/base
我试图了解 http://gruntthepeon.free.fr/ssemath/sse_mathfun.h 中 exp_ps() 的实现或 http://software-lisc.fbk.eu/
我正在使用模板类 ( Pol ) 来计算多项式,并希望使用成员函数 ( .exp() ) 将多项式 P 转换为其指数 e^P。 重载指数函数工作正常,编译器选择原始指数 exp(double)如果T
在python中,我们说万物皆对象, 例如:表达式x
您认为可以使用多个线程来计算指数函数吗?我有一个代码,瓶颈是 long double expl( long double ) 的计算。所有其余的都已经并行化了。我尝试了几种近似值,但到目前为止没有任何
我正在尝试将 exp(x) 函数扩展为泰勒级数。这是代码: double CalcExp(){ double eps = 0.0000000000000000001; double elem = 1.
我是一名优秀的程序员,十分优秀!