4

我有一些 C99 代码,我需要将 2n double 数组转换为 n double 复数数组。我这样做

static void real_to_complex(const double *r, size_t n, double complex *z)
{
  size_t i;

  for (i=0 ; i<n ; i++)
    z[i] = r[2*i] + r[2*i + 1]*I;
}

这是代码的性能关键部分,我真的不想创建一个新的存储区域 z 并且有复制的费用,而是我想用这些函数调用替换

z = (double complex*)r;

有没有办法做到这一点并保持符合标准?我知道双复数保证与两个双精度数组具有相同的布局——也许我可以通过编译器检查这个布局是(真实的,想象的)还是(想象的,真实的)?

4

1 回答 1

3

您可以保证complex数组的第一个元素对应于实部,第二个元素对应于虚部。

引用自公开的 C11 标准草案

6.2.5/13 每个复数类型具有与恰好包含对应实数类型的两个元素的数组类型相同的表示和对齐要求;第一个元素等于复数的实部,第二个元素等于复数的虚部。

示例程序

#include <complex.h>
#include <stdio.h>

int main(void) {
  double x[] = {42, 2, 41, 1, 0, 0};
  _Complex double *y = (void*)x;
  while (creal(*y) > 0) {
    printf("%f + %fi\n", creal(*y), cimag(*y));
    y++;
  }
  return 0;
}
于 2012-08-06T17:37:55.063 回答