当前位置: 首页 > 知识库问答 >
问题:

为什么向0.0应用指数移动平均线较慢?

夹谷琨
2023-03-14

这是我的代码:

#include <math.h> 
#include <iostream>

using namespace std;

inline void Task(double start, double target) {
    double a0 = 0.0101252;
    double z = start;

    double value = -1.0;
    double temp = 0.0;
    int counter = 0;    
    while (value != temp) {
        temp = value;

        // exponential moving average
        z += a0 * (target - z);
        value = z;

        counter++;
    }

    cout << "start: " << start << " | target: " << target << " | iterations: " << counter << std::endl;    
}

int main() 
{   
    Task(0.0, 0.01);
    Task(0.01, 0.0);

    Task(0.01, 0.02);
    Task(0.02, 0.01);    
}

将指数移动平均值从0.1应用到0.2(或从0.2应用到0.1或从0.0应用到0.1)会导致大约3100次迭代:

start: 0 | target: 0.01 | iterations: 3173
start: 0.01 | target: 0.02 | iterations: 3105
start: 0.02 | target: 0.01 | iterations: 3173

相反,如果我使用0.0,它的迭代成本要高出25倍:

start: 0.01 | target: 0 | iterations: 72305

为什么?棘手的地方在哪里?我想不出来。非规范化?

共有1个答案

卫泉
2023-03-14

双精度表示的值在接近零时密度更大。当值==温度时,即基本上接近目标,误差通过舍入而丢失时,就打破了循环。这反过来又有效地意味着,当目标值接近零时,您需要比目标值的绝对值大得多的精度。

您可能希望选择一个比“尾数的最后一位”更合理的精度目标。

 类似资料:
  • 我也看过Pyspark中的加权移动平均线,但我需要一个Spark/Scala的方法,以及10天或30天的均线。 有什么想法吗?

  • 公式链接:https://sciencing.com/calculate-exponential-moving-averages-8221813.html

  • Python是否有一个SciPy函数或NumPy函数或模块来计算给定特定窗口的一维数组的运行平均值?

  • 问题内容: 我有一个二维的numpy数组。我想对每个条目取n个最近条目的平均值,就像对一维数组取滑动平均值一样。什么是最干净的方法? 问题答案: 这与将 滤镜 应用于 图像的 概念类似。 幸运的是,有很多功能可以做到这一点。您所追求的是。 可以这样使用: 如果您需要5x5滤镜,请使用。该选项控制如何处理边缘。您没有指定要如何处理边缘。在此示例中,“常量”模式表示将数组边界之外的每个项目都视为常量值

  • 问题内容: 我有一个表(日期,有效负载),其中包含约10年的数据,我想基于14天(2周)和90天(12周)的间隔计算移动平均值(MA),以显示有效负载的趋势 我已经写了这个查询,但是它得到了错误的值 实际上我知道是什么,但我不了解Oracle的工作原理! 我可以在Excel中进行计算,但是我需要在数据库级别执行此操作,能否请您告诉我如何执行此操作? 问题答案: 我不明白使用的目的是什么?根据文档,

  • 我又用Python玩了一点,我找到了一本有例子的整洁的书。其中一个例子是绘制一些数据。我有一个有两列的。txt文件,我有数据。我把数据绘制得很好,但在练习中,它说:进一步修改程序,计算并绘制数据的运行平均值,定义如下: 其中在本例中(并且是数据文件中的第二列)。使程序将原始数据和运行平均值绘制在同一张图上。 到目前为止我有这个: 非常感谢^^:)