- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一些 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;
有什么方法可以做到这一点并保持符合标准吗?我知道双复数保证与两个 double 组具有相同的布局——也许我可以通过编译器检查这个布局是(实数,虚数)还是(虚数,实数)?
最佳答案
complex
数组的第一个元素对应于实部,第二个元素对应于虚部。
引自 the publicly available draft of C11 Standard
6.2.5/13 Each complex type has the same representation and alignment requirements as an array type containing exactly two elements of the corresponding real type; the first element is equal to the real part, and the second element to the imaginary part, of the complex number.
示例程序
#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;
}
关于C99复铸件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11827280/
我正在开发一个 Angular 应用程序并想使用 Protractor 对其进行测试。我在中继器内有一个中继器。 我这样选择第一个中继器: var firstRepeater = element.al
vector *> victimDomains; 这是什么意思? 我得到了第一颗星 ( DomainInfo* ) 但第二颗是什么? 让我们说 DomainInfo有两个属性 ID和 name .如
如果我执行这段代码: vector > idft( vector > * v) { for_each(v->begin(), v->end(), conj); 然后编译器给我以下错误: dft
我是一名优秀的程序员,十分优秀!