标签: approximation

Matlab代码近似指数函数

在处理大和负实数时,有没有人知道如何使下面的Matlab代码更准确地逼近指数函数?

例如,当x = 1时,代码效果很好,当x = -100时,它应该更接近3.7201e-44时返回8.7364e + 31的答案.

代码如下:

s=1
a=1;
y=1;
for k=1:40
    a=a/k;
    y=y*x;
    s=s+a*y;
end
s
Run Code Online (Sandbox Code Playgroud)

欢迎任何帮助,欢呼.

编辑:

好的,问题如下:

这段代码接近哪个数学函数?(我说指数函数.)当x = 1时它是否有效?(是的.)不幸的是,当x = -100时使用它会产生答案s = 8.7364e + 31.您的同事认为该程序中存在一个愚蠢的错误,并请求您的帮助.仔细解释行为并给出一个简单的修复,产生更好的结果.[您必须建议对上述代码进行修改,或者使用它.您还必须检查您的简单修复工作.]

所以我有点明白,当术语之间存在16个(或更多)数量级时,问题会围绕大数字,精度会丢失,但解决方案不能解决.

谢谢

编辑:

所以最后我接受了这个:

s = 1;
x = -100;
a = 1;
y = 1;
x1 = 1;

for k=1:40
    x1 = x/10;
    a = a/k;
    y = y*x1;
    s = s + a*y;
end

s = s^10;
s
Run Code Online (Sandbox Code Playgroud)

不确定它是否完全正确但它会返回一些好的近似值.

exp(-100)= 3.720075976020836e-044 …

math matlab approximation exp

4
推荐指数
2
解决办法
8066
查看次数

"atan"函数在不动点的逼近

我必须做一些需要使用三角函数的计算,特别是那个atan.代码将在Atmega328p上运行,为了提高效率,我不能使用floats:我使用的是定点数.因此,我无法使用标准atan功能.

我有一个函数,它采用定点格式的值s16_10(有符号,16位宽,第10位),并返回s16_6格式.输入将介于0和1之间(因此为0和2 10),因此输出(以度为单位)将介于-45和45之间(因此-45*2 6和45*2 6).

假设Y是固定点,y是s16_6表示,弧的实际角度,x是x atan(x) = y,X是s16_10的x表示.我从使用atan4度多项式近似函数,从(0,1)到(-45,45)开始,发现我们可以使用:

y ~= 8.11 * x^4 - 19.67 * x^3 - 0.93 * x^2 + 57.52 * x + 0.0096
Run Code Online (Sandbox Code Playgroud)

这导致:

Y ~= (8.11 * X^4)/2^34 - (19.62* X^3)/2^24 - (0.93 * X^2)/2^14 + (57.52*X)/2^4 + 0.0069 * 2^6
Run Code Online (Sandbox Code Playgroud)

在这里我被卡住了......一方面,计算X^4将导致定义间隔的五分之一为0,另一方面,{ 3,2,1 }中的2 n4 n通常也会导致零价值......我怎么办?

math microcontroller atmega trigonometry approximation

4
推荐指数
1
解决办法
986
查看次数

续分数Python

我是Python的新手,被要求创建一个程序,该程序将输入作为非负整数n,然后使用连续分数的前n + 1个项来计算e的近似值:

我试图破译这个问题,但无法完全理解它所问的一切。我不是在寻找确切的答案,而是希望有一个例子可以对我有所帮助。

这是确切的问题,
下面是我之前对连续分数所做的代码。

import math
# Get x from user
x = float(input("Enter x = "))

# Calculate initial variables and print
a0 = x//1
r0 = x-a0
print("a0 =", a0, "\tr0 =", r0)

# Calculate ai and ri for i = 1,2,3 and print results

a1 = 1/r0//1
r1 = 1/r0 - a1
print("a1 =", a1, "\tr1 =", r1)

a2 = 1/r1//1
r2 = 1/r1 - a2
print("a2 =", a2, "\tr2 =", r2)

a3 = 1/r2//1 …
Run Code Online (Sandbox Code Playgroud)

python approximation python-3.x continued-fractions

4
推荐指数
2
解决办法
5831
查看次数

仅使用单精度浮点数逼近 [0,pi] 上的余弦

我目前正在研究余弦的近似值。由于最终目标设备是使用 32 位浮点 ALU / LU 的自行开发,并且有专门的 C 编译器,因此我无法使用 C 库数学函数(cosf,...)。我的目标是编写在准确性和指令/周期数量方面不同的各种方法。

我已经尝试了很多不同的近似算法,从 fdlibm、泰勒展开、pade 近似、使用枫树的 remez 算法等开始......

但是,一旦我仅使用浮点精度来实现它们,就会显着降低精度。并且可以肯定:我知道双精度,更高的精度完全没有问题......

现在,我有一些近似值,在 pi/2(出现最大误差的范围)附近精确到几千 ulp,我觉得我受到单精度转换的限制。

为了解决主题参数减少:输入是弧度。我认为参数减少会由于除法/乘法而导致更多的精度损失......因为我的整体输入范围只有 0..pi,我决定将参数减少到 0..pi/2。

因此,我的问题是:有没有人知道高精度(并且在最好的情况下效率高)余弦函数的单精度近似值?是否有任何算法可以优化单精度的近似值?你知道内置的 cosf 函数是否在内部计算单精度双精度的值吗?~

float ua_cos_v2(float x)
{
    float output;
    float myPi = 3.1415927410125732421875f;
    if (x < 0) x = -x;
    int quad = (int32_t)(x*0.63661977236f);//quad = x/(pi/2) = x*2/pi
    if (x<1.58f && x> 1.57f) //exclude approximation around pi/2
    {
        output = -(x - 1.57079637050628662109375f) - 2.0e-12f*(x - 1.57079637050628662109375f)*(x - 1.57079637050628662109375f) + 0.16666667163372039794921875f*(x - 1.57079637050628662109375f)*(x - 1.57079637050628662109375f)*(x - 1.57079637050628662109375f) …
Run Code Online (Sandbox Code Playgroud)

c floating-point trigonometry approximation single-precision

4
推荐指数
1
解决办法
257
查看次数

有没有办法在java double中获得小数点后的位数?

我正在开发Java/Groovy程序.我有一个双变量,它包含一个用户输入的数字.我真正想知道的是用户在小数点右侧键入了多少个数字.就像是:

double num = 3.14
num.getPlaces() == 2
Run Code Online (Sandbox Code Playgroud)

当然,你不能用double来做这个,因为那是使用IEEE浮点数而且它都是近似值.

假设我无法获取用户输入的字符串,但只能访问已存储的值的double,有没有办法可以通过BigDecimal擦除那个double,或者某些东西可以得到"真实"的数字小数位?(当双重显示在屏幕上时,它会正确,所以我认为有一种方法至少可以猜到吗?)

java floating-point groovy approximation

3
推荐指数
1
解决办法
5122
查看次数

近似方法

我附图: alt text http://i.piccy.info/i4/42/5f/ca0c6fc155fb40d420f62888829f.jpeg

所以在这个图像中有一个函数图,它在给定的点上定义.例如,在点x = 1..N上.

另一个图,绘制为半透明曲线,这是我想从原始图中得到的,即我想近似原始函数,使其变得平滑.

有没有办法做到这一点?

我听说过最小二乘法,可用于通过直线或抛物线函数逼近函数.但我不需要用抛物线函数来近似.我可能需要通过三角函数来近似它.那么有没有办法做到这一点?还有一个想法,如果我们可以推导它用于三角函数,是否可以使用最小二乘法来解决这个问题?

还有一个问题!如果我使用离散傅立叶变换并将函数视为波的总和,那么噪声可能具有我们可以定义它的特殊特征,然后我们可以将相应的频率设置为零,然后执行逆傅里叶变换.因此,如果您认为有可能,那么您可以建议什么来识别噪声的频率?

math approximation

3
推荐指数
1
解决办法
1491
查看次数

使用移位和加/减来除以常数

嗨所有我试图除以无符号常数除以仅使用移位和加/减 - 如果它是乘法我没有问题,但我有点被分裂困扰.

例如,假设常数除数为192,可以说红利为8000

"完整结果"y = 8000/192 = 41(假设我没有保留小数位)

y = 8000 >> 8 ... 31 y = 8000 >> 7 ... 62

但是,我如何获得更准确的解决方案?

非常感谢!

math performance assembly bit-manipulation approximation

3
推荐指数
2
解决办法
3706
查看次数

反向不完全伽马函数的简单近似

如何用一些简单的分析函数f(s,Г)来近似反不完全伽马函数 Г(s,x)?这意味着写出类似x = f(s,Г)= 12*log(123.45*Г)+Г+ 123.4 ^ s的东西.

(我至少需要想法或参考.)

math statistics approximation gamma-function

3
推荐指数
1
解决办法
3278
查看次数

从固定点atan2()近似中删除慢的int64除法

我做了一个函数来计算atan2(y,x)的定点近似.问题在于运行整个函数所需的~83个循环,70个循环(在AMD FX-6100上使用gcc 4.9.1 mingw-w64 -O3进行编译)完全由一个简单的64位整数除法完成!遗憾的是,该分裂的任何条款都不变.我能加速分裂吗?有什么方法可以删除它吗?

我想我需要这个除法,因为我用1D查找表近似atan2(y,x)我需要将x,y表示的点的距离标准化为单位圆或单位正方形(我选择了一个单位')菱形'是一个旋转45°的单位正方形,在正象限上提供非常均匀的精度).所以除法找到(| y | - | x |)/(| y | + | x |).注意,除数是32位,而分子是32位数,右移29位,因此除法的结果有29个小数位.同样使用浮点除法不是一个选项,因为此函数不需要使用浮点运算.

有任何想法吗?我想不出有什么可以改善这一点(我无法弄清楚为什么只需要一个师就需要70个周期).这是完整的参考功能:

int32_t fpatan2(int32_t y, int32_t x)       // does the equivalent of atan2(y, x)/2pi, y and x are integers, not fixed point
{
    #include "fpatan.h" // includes the atan LUT as generated by tablegen.exe, the entry bit precision (prec), LUT size power (lutsp) and how many max bits |b-a| takes (abdp)
    const uint32_t outfmt = 32; // final output format in s0.outfmt
    const …
Run Code Online (Sandbox Code Playgroud)

c optimization fixed-point integer-division approximation

3
推荐指数
1
解决办法
896
查看次数

Spark中高效计算top-k元素

我有一个类似于以下内容的数据框:

+---+-----+-----+
|key|thing|value|
+---+-----+-----+
| u1|  foo|    1|
| u1|  foo|    2|
| u1|  bar|   10|
| u2|  foo|   10|
| u2|  foo|    2|
| u2|  bar|   10|
+---+-----+-----+
Run Code Online (Sandbox Code Playgroud)

并希望得到以下结果:

+---+-----+---------+----+
|key|thing|sum_value|rank|
+---+-----+---------+----+
| u1|  bar|       10|   1|
| u1|  foo|        3|   2|
| u2|  foo|       12|   1|
| u2|  bar|       10|   2|
+---+-----+---------+----+
Run Code Online (Sandbox Code Playgroud)

目前,有类似的代码:

val df = Seq(("u1", "foo", 1), ("u1", "foo", 2), ("u1", "bar", 10), ("u2", "foo", 10), ("u2", "foo", 2), ("u2", "bar", 10)).toDF("key", "thing", "value")

 // calculate …
Run Code Online (Sandbox Code Playgroud)

approximation rank window-functions apache-spark apache-spark-sql

3
推荐指数
1
解决办法
3549
查看次数