问题标签 [exp]
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.
c++ - double exp(double) 意外返回 NaN(无浮点溢出)
我一直致力于根据普朗克定律实施黑体辐射,具体如下:
我有一个 float[max-min+1] 数组,其中 static const int max=780,static const int min = 380。我只是遍历数组,然后输入 BlackBody 为波长提供的值(波长 = array-指数 + 分钟)。IntensitySpectrum::BlackBody 执行此迭代,而 min 和 max 都是静态成员变量,并且数组也在 IntensitySpectrum 内部。
问题在于,线谱.BlackBody() 将数组的第 0 个元素设置为 NaN,并且只有第 0 个元素。此外,它不会发生在第一次迭代中,而是发生在 xc>=10 的所有以下迭代中。
来自 VS 调试器的文本:频谱 = {intensity=0x009bec50 {-1.#IND0000, 520718784., 537559104., 554832896., 572547904., 590712128., 609333504., ...} }
我跟踪错误, ::BlackBody() 函数中的 exppart 变为 NaN,基本上 exp() 返回 NaN,即使它的参数接近 2.0,所以绝对不会溢出。但仅适用于数组索引 0。它神奇地开始为其余 400 个索引工作。
我知道内存溢出可能会导致这样的事情。这就是为什么我仔细检查了我的内存处理。我正在从另一个自制的库中链接 Vec3,该库要大得多,并且可能包含错误,但我从 Vec3 使用的内容与内存无关。
几个小时后,我完全一无所知。还有什么可能导致这种情况?优化器或 WINAPI 是否在欺骗我……?(嗯,是的,该程序使用 WINAPI 创建了一个窗口,并使用了一个几乎为空的 WndProc,它在 WM_PAINT 上调用我的代码。)
感谢您提前提供帮助。
很抱歉弄得不清楚。这是布局:
c - 预计算指数 (exp) 表
我正在尝试理解word2vec项目中的代码。我指的文件是word2vec.c。代码片段是:
目前尚不清楚预先计算这些值有什么好处。有人可以解释一下吗?
c - 如何在 NASM for Linux 中正确使用 C 函数“Exp”?
我正在尝试在 Linux 的 NASM 中实现 C 函数“exp”。该函数接受一个双精度值 x,并返回一个双精度值 r = e^x,其中 e 是欧拉数。这是我的实现:
在编译尝试时,我得到以下信息:
这是指当我实际调用 exp 时,这很奇怪,因为“extern exp”似乎工作得很好。我做错了什么?
c - 将函数 e^(-x) 和 e^(-x^2) 传递到 C 中用于计算的函数中
我必须编写一个程序,将函数传递给另一个函数e^(-x)
,e^(-x^2)
称为calculateIntegral()
,然后计算函数的积分。
限制:
calculateIntegral()
是将用于计算两者积分的e^(-x)
函数e^(-x^2)
- 我只能将传递的函数、
a
边界b
和区间数作为函数的参数calculateIntegral()
。
我曾考虑过更改x
为,例如,-x
在函数外部并将其分配给另一个变量以计算 in e^(x)
,但随后我必须将其作为另一个参数包含在calculateIntegral()
.
有没有办法改变原来的e^(x)
,所以当它被传递到时calculateIntegral()
,e^(-x)
剩下的函数只需将边界插入到该方程中进行计算?
matlab - Matlab,exp函数溢出
谁能建议我如何找到exp
Matlab 中的函数不会溢出的最大值和溢出的最小值。
谢谢你!
performance - MATLAB中加速exp(A*x)的解析方式
我需要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
是 26873856 x 81 的大小(是的,它是那么大),所以x
是 81 x 1。
nnz(A) / numel(A)
是0.0012
,nnz(A*x) / numel(A*x)
是0.0075
。我已经使用稀疏矩阵来表示A
,但是,稀疏矩阵的 exp() 不再是稀疏的。所以事实上,我存储x
non-sparse 并且我计算exp(full(A*x))
结果是快/慢full(exp(A*x))
(我认为A*x
无论如何都是非稀疏的,因为 x 是非稀疏的。)exp(full(A*sparse(x)))
是一种拥有 sparse 的方法A*x
,但速度较慢. 甚至更慢的变体是exp(A*sparse(x))
(对于稀疏类型的非稀疏矩阵具有双倍的内存影响)和full(exp(A*sparse(x))
(这再次产生非稀疏结果)。
是的,我确实计算了元素 exp,我更新了上面的等式以反映这一点。
另一个编辑:我试图变得聪明,但收效甚微:
c++ - std::exp 给出的结果与复数的 MATLAB exp 不同
我正在将一个脚本从 matlab 复制到一个 c++ 函数中。但是,对于 exp 函数,我不断得到不同的结果。例如,以下代码段:
应该等同于 MATLAB 代码
但事实并非如此。对于 MATLAB,我得到 -1 + 0i(这是正确的),对于 c++,我得到 -1 + -2.068231e-013*i。
现在我一开始以为这只是某种舍入误差,但是对于我正在使用的实际脚本,它具有更大的复指数,我得到完全不同的数字。这是什么原因?我该如何解决?
编辑:我已经手动尝试用欧拉公式计算指数
并在 c++ 中获得相同的不稳定结果
c++ - How to use the overloaded and original exp inside a member of a template class
I am using a template class (Pol<T>
) to calculate with polynomials and want to use a member function (.exp()
) to convert a polynomial P into its exponential e^P.
Overloading the exponential function works fine, the compiler chooses the original exponential exp(double)
if T = double
and my own if T=Pol<double>
, but in the member function I get:
I cannot use std::exp in the member function, since I am using multiple orders of polynomials like:
I could use the overloaded exponential to make a workaround, but I don't see, why it should not be possible inside the member.
Here is my code:
matlab - 数值稳定的实现
我需要在 Matlab 中计算向量的归一化指数。
简单地写
V 的元素中的溢出大于 log(realmax) = 709.7827。(我不确定下溢条件。)
我应该如何实现它以避免数值不稳定?
更新:我收到了关于如何避免溢出的优秀回复。但是,我仍然很高兴听到您对代码中下溢可能性的看法。
c - C中的错误结果
我想编写一个使用高斯算法计算求幂的程序,但是如果给定输入等 base=2,exp=50,我得到的结果是 0.0000。