小编use*_*116的帖子

如果数学移至内联函数,为什么 C++ 舍入行为(对于编译时常量)会发生变化?

考虑以下函数:

static inline float Eps(const float x) {
  const float eps = std::numeric_limits<float>::epsilon();
  return (1.0f + eps) * x - x;
}

float Eps1() {
  return Eps(0xFFFFFFp-24f);
}

float Eps2() {
  const float eps = std::numeric_limits<float>::epsilon();
  const float x = 0xFFFFFFp-24f;
  return (1.0f + eps) * x - x;
}
Run Code Online (Sandbox Code Playgroud)

-O2with中-std=c++20,这两个函数都编译为一个函数,movss后跟一个ret针对 x86 的 using clang 16.0.0 和mov一个bx针对 ARM 的 with gcc 11.2.1。为 ARM 生成的程序集与返回值 ~5.96e-8 一致,但为 x86 生成的程序集则不然。 …

c++ floating-point clang compiler-optimization clang++

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

初始化结构与匿名结构有什么区别?

考虑以下代码:

typedef struct {
  uint32_t a : 1;
  uint32_t b : 1;
  uint32_t c : 30;
} Foo1;

void Fun1(void) {
  volatile Foo1 foo = (Foo1) {.a = 1, .b = 1, .c = 1};
}
Run Code Online (Sandbox Code Playgroud)

当使用位字段在嵌入式应用程序中打孔寄存器时,这种通用模式会出现很多。使用ARM最近gcc编译器(如GCC 8.2或7.3 GCC)与-O3-std=c11,我得到以下组件:

  sub sp, sp, #8
  movs r3, #7
  str r3, [sp, #4]
  add sp, sp, #8
  bx lr
Run Code Online (Sandbox Code Playgroud)

这几乎正​​是您想要和期望的。变量Foo不是易失性的,因此0x7在最终存储到易失性变量(寄存器)之前,可以将每个位的初始化组合在一起成为文字foo

但是,能够操纵整个寄存器的原始内容很方便,这会导致位字段的匿名实现:

typedef union {
  struct {
    uint32_t a : 1;
    uint32_t b : …
Run Code Online (Sandbox Code Playgroud)

c optimization union gcc struct

6
推荐指数
1
解决办法
129
查看次数

绘制大型时间序列

问题摘要:

是否有任何易于实现的算法可以减少表示时间序列所需的点数而不改变它在图中的显示方式?

激励问题:

我正在尝试交互式地显示从~20 kHz的嵌入式系统记录的10到15个数据通道.日志可以覆盖超过一小时的时间,这意味着我正在处理1e8和1e9点之间.此外,我关心可能持续很短时间(即小于1毫秒)的小异常,因此不能选择简单的抽取.

毫不奇怪,大多数绘图库如果你做了天真的事情并尝试将它们的数据大于专用的GPU内存,那么会有点难过.它在我的系统上实际上比这更糟糕; 使用随机浮点数向量作为测试用例,在刷新率低于1 FPS之前,我只能从Matlab绘图函数和Python + matplotlib中获得大约5e7点.

现有问题和解决方案:

这个问题有点类似于许多现有问题,例如:

但处理更大的数据集和/或以交互性为代价对保真度更严格(获得60 FPS柔滑平滑的平移和缩放会很棒,但实际上,我会对1 FPS感到满意).

显然,需要某种形式的数据减少.在搜索解决我的问题的现有工具时,我发现了两种范例:

  • 抽取但跟踪异常值: Matlab + dsplot就是一个很好的例子(即我在上面链接的第一个问题的接受答案中建议的工具).dsplot向下抽取到固定数量的均匀间隔点,但随后在使用高通FIR滤波器的标准偏差识别的异常值中加回.虽然这可能是几类数据的可行解决方案,但如果有大量频率内容超过滤波器截止频率并且可能需要调整,则可能存在困难.

  • 绘图最小值和最大值:使用此方法,将时间序列划分为与每个水平像素对应的间隔,并仅绘制每个间隔中的最小值和最大值.Matlab + Plot(Big)就是一个很好的例子,但是使用最小值和最大值的O(n)计算使得它在达到1e8或1e9点时有点慢.mex函数或python中的二叉搜索树可以解决这个问题,但实现起来很复杂.

有没有更简单的解决方案可以满足我的需求?

编辑(2018-02-18):重构的问题是关注算法而不是实现算法的工具.

plot time-series

5
推荐指数
1
解决办法
424
查看次数