我对np.exp()实际上做了什么非常困惑.在文档中它说:"计算输入数组中所有元素的指数." 我很困惑这究竟是什么意思.有人可以给我更多信息,甚至指出我正确的方向来了解更多信息.
我有一个固定点类(10.22),我需要一个pow,一个sqrt,一个exp和一个日志函数.
唉,我不知道从哪里开始.任何人都可以提供一些有用的文章的链接,或者,还没有给我提供一些代码?
我认为,一旦我有了exp函数,那么实现pow和sqrt变得相对容易.
pow(x,y)=> exp(y*log(x))sqrt(x)=> pow(x,0.5)
它只是那些我发现很难的exp和日志函数(好像我记得我的一些日志规则,我记不起其他的很多了).
据推测,顺便说一句,对于sqrt和pow也会有一个更快的方法,所以即使只是说使用上面概述的方法:)前面的任何指针都会受到赞赏:)
请注意:这是跨平台和纯C/C++代码,所以我不能使用任何汇编程序优化.
使用numpy,我有一个函数的定义:
def powellBadlyScaled(X):
f1 = 10**4 * X[0] * X[1] - 1
f2 = numpy.exp(-numpy.float(X[0])) + numpy.exp(-numpy.float(X[1])) - 1.0001
return f1 + f2
Run Code Online (Sandbox Code Playgroud)
在优化例程中,此函数被评估了很多次.它经常引发异常:
RuntimeWarning: overflow encountered in exp
Run Code Online (Sandbox Code Playgroud)
我知道操作数不能存储在float的已分配空间中.但是我怎样才能克服这个问题呢?
我怎么能用x.append(1-e^(-value1^2/2*value2^2))python 2.7 编写?
我不知道如何使用电源操作器和e.
我正在尝试快速的Exp(x)函数,这个函数之前在这个回答中描述了一个提高C#计算速度的SO问题:
public static double Exp(double x)
{
var tmp = (long)(1512775 * x + 1072632447);
return BitConverter.Int64BitsToDouble(tmp << 32);
}
Run Code Online (Sandbox Code Playgroud)
表达式使用一些IEEE浮点"技巧",主要用于神经集.该功能比常规Math.Exp(x)功能快约5倍.
不幸的是,相对于常规Math.Exp(x)函数,数值精度仅为-4% - + 2%,理想情况下,我希望精度至少在亚百分比范围内.
我已经绘制了近似和常规Exp函数之间的商,并且从图中可以看出,相对差异似乎以几乎恒定的频率重复.

是否有可能利用这种规律性来进一步提高"快速exp"功能的准确性而不会显着降低计算速度,或者精度提高的计算开销是否会超过原始表达式的计算增益?
(作为旁注,我也尝试过在同一个SO问题中提出的替代方法之一,但这种方法在C#中似乎没有计算效率,至少在一般情况下并非如此.)
5月14日更新
根据@Adriano的要求,我现在已经执行了一个非常简单的基准测试.我已经使用每个替代exp函数对[-100,100]范围内的浮点值执行了1000万次计算.由于我感兴趣的值范围从-20到0,我还明确列出了x = -5处的函数值.结果如下:
Math.Exp: 62.525 ms, exp(-5) = 0.00673794699908547
Empty function: 13.769 ms
ExpNeural: 14.867 ms, exp(-5) = 0.00675211846828461
ExpSeries8: 15.121 ms, exp(-5) = 0.00641270968867667
ExpSeries16: 32.046 ms, exp(-5) = 0.00673666189488182
exp1: 15.062 ms, exp(-5) = -12.3333325982094
exp2: 15.090 …Run Code Online (Sandbox Code Playgroud) 我有一个由3个项目组成的解决方案.一个是静态库,两个是基于控制台的.exe文件,它们依赖于此库并链接到该库.他们的设置似乎相同.我建立了其中一个:
1> ------ Build build:项目:masksample,配置:Debug Win32 ------
1>编译...
1> stdafx.cpp
1>编译...
1> masksample.cpp
1>编译显示资源...
1>链接...
1> LINK:C:\ Users\DarekSz\Praca\cci\Debug\masksample.exe未找到或未由最后一个增量链接构建; 执行完整链接
1>嵌入清单...
1>掩码样本 - 0错误,0警告
==========构建:1成功,0失败,1最新, 0跳过==========
然后我继续建造另一个:
1> ------ Build build:项目:calibsample,配置:Debug Win32 ------
1>编译...
1> stdafx.cpp
1>编译...
1> calibsample.cpp
1>编译显示资源...
1>链接...
1>链接:C:\ Users\DarekSz\Praca\cci\Debug\calibsample.exe未找到或未由最后一个增量链接构建; 执行完整链接
1>创建库C:\ Users\DarekSz\Praca\cci\Debug\calibsample.lib和对象C:\ Users\DarekSz\Praca\cci\Debug\calibsample.exp
1>嵌入清单...
1> calibsample - 0错误,0警告
==========构建:1成功,0失败,1最新,0跳过==========
为什么链接器这次会创建.lib和.exp文件?是否有一些选项可以打开和关闭我在不知情的情况下激活它?
Debian系统上的C数学库的GCC实现显然符合(IEEE 754-2008)函数的实现,这意味着舍入应始终是正确的:exp
(来自维基百科)IEEE浮点标准保证加,减,乘,除,融合乘加,平方根和浮点余数将给出无限精度运算的正确舍入结果.对于更复杂的功能,1985年标准中没有给出这样的保证,它们通常只能在最后一点内准确到达.但是,2008标准保证符合要求的实现将给出正确的舍入结果,这些结果遵循主动舍入模式; 但是,函数的实现是可选的.
事实证明,我遇到了这个功能实际上阻碍的情况,因为exp函数的确切结果通常几乎恰好处于两个连续double值(1)之间的中间位置,然后程序进行了大量的进一步计算,失去了速度高达400(!):这实际上是对我的解释(不好问:-S)问题#43530011.
(1)更确切地说,当参数exp变为(2 k + 1)×2 -53,其中k为相当小的整数(例如242)时,就会发生这种情况.特别是,所涉及的计算pow (1. + x, 0.5)倾向于exp使用这样的参数进行调用x,其数量级为2 -44.
由于正确舍入的实现在某些情况下可能非常耗时,我想开发人员也会设计一种方法来获得稍微不那么精确的结果(例如,最多只有0.6 ULP或类似的东西)对于给定范围内的每个参数值(大致)有界限...(2)
......但是怎么做?
(2)我的意思是,我只是不希望像(2 k + 1)×2 -53这样的参数的某些特殊值比相同数量级的大多数值更耗时; 但是我当然不介意参数的某些特殊值是否更快,或者如果大参数(绝对值)需要更大的计算时间.
这是一个显示现象的最小程序:
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <time.h>
int main (void)
{
int i;
double a, c;
c = 0;
clock_t start = clock …Run Code Online (Sandbox Code Playgroud) 我需要f(x)=exp(A*x)反复计算一个微小的,可变的列向量x和一个巨大的,恒定的矩阵A(许多行,几列).换句话说,x很少,但A*x很多.我的问题维度是这样的,它A*x占用了与exp()部分一样多的运行时间.
除了泰勒展开,并预先计算值的范围exp(y)(假设已知的范围内y的值A*x),这是我没有设法大大加快(同时保持精度)就什么MATLAB是对自己做的,我考虑分析性地重述问题,以便能够预先计算某些值.
例如,我发现了 exp(A*x)_i = exp(\sum_j A_ij x_j) = \prod_j exp(A_ij x_j) = \prod_j exp(A_ij)^x_j
这将允许我预先计算exp(A)一次,但是循环中所需的取幂与原始exp()函数调用一样昂贵,并且必须另外执行乘法(\ prod).
我还有其他想法可以遵循,或者我可能错过了MATLAB中的解决方案吗?
编辑:更多细节
A尺寸为81的是26873856(是的,那是巨大的),所以x是81乘1.
nnz(A) / numel(A)是0.0012,nnz(A*x) / numel(A*x)是0.0075.我已经使用稀疏矩阵来表示A,但稀疏矩阵的exp()不再稀疏.所以事实上,我存储x非稀疏和我计算的exp(full(A*x))结果是快/慢full(exp(A*x))(我认为无论A*x是非稀疏的,因为x是非稀疏的.)exp(full(A*sparse(x)))是一种稀疏的方法A*x,但速度较慢.甚至更慢的变体exp(A*sparse(x))(对于稀疏类型的非稀疏矩阵具有双倍的内存影响)和full(exp(A*sparse(x))(其再次产生非稀疏结果).
sx = sparse(x);
tic, …Run Code Online (Sandbox Code Playgroud) 好的,我知道答案,但受到这个问题的启发,我想对以下内容得到一些好的看法:为什么下面的Rcpp练习是ca. 比内置的快15%(对于长向量)exp()?我们都知道Rcpp是R/C API的包装器,所以我们应该期待性能略差一些.
Rcpp::cppFunction("
NumericVector exp2(NumericVector x) {
NumericVector z = Rcpp::clone(x);
int n = z.size();
for (int i=0; i<n; ++i)
z[i] = exp(z[i]);
return z;
}
")
library("microbenchmark")
x <- rcauchy(1000000)
microbenchmark(exp(x), exp2(x), unit="relative")
## Unit: relative
## expr min lq median uq max neval
## exp(x) 1.159893 1.154143 1.155856 1.154482 0.926272 100
## exp2(x) 1.000000 1.000000 1.000000 1.000000 1.000000 100
Run Code Online (Sandbox Code Playgroud) 我是MATLAB的初学者,我需要代表e (-t 2).
我知道,例如,代表我使用的e xexp(x),我尝试了以下内容
1)tp = t ^ 2;/tp = t*t; X = EXP(-TP);
2)x = exp(-t ^ 2);
3)x = exp( - (t*t));
4)x = exp(-t)*exp(-t);
这样做的正确方法是什么?
exp ×10
python ×3
c ×2
matlab ×2
numpy ×2
performance ×2
c# ×1
c++ ×1
equation ×1
exponential ×1
fixed-point ×1
ieee-754 ×1
libm ×1
linker ×1
logarithm ×1
math ×1
overflow ×1
r ×1
rcpp ×1
rounding ×1
simplify ×1
statistics ×1
visual-c++ ×1