Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C语言中有效地处理复数?_C_C99_Complex Numbers - Fatal编程技术网

如何在C语言中有效地处理复数?

如何在C语言中有效地处理复数?,c,c99,complex-numbers,C,C99,Complex Numbers,如何在C语言中有效地处理复数 我们有3种选择: 使用结构并按值将其传递给函数: 但通过这种方式,我们有3次复制结构的值(两个参数和一个返回)。ComplexDouble的大小是16字节,因此我们需要复制3*16字节=48字节,这可能是不够的 将指针传递到结构: 在这个变体中,我们向结构传递3个指针,即3*8字节=24字节。也许这样更有效 使用C99标准库中的复杂类型: 但关于C99复杂类型,我有一些不明白的地方。double complex实际上是如何传递到函数中并从函数返回的?它是否像第一个带

如何在C语言中有效地处理复数

我们有3种选择:

  • 使用结构并按值将其传递给函数:
  • 但通过这种方式,我们有3次复制结构的值(两个参数和一个返回)。
    ComplexDouble
    的大小是16字节,因此我们需要复制3*16字节=48字节,这可能是不够的

  • 将指针传递到结构:
  • 在这个变体中,我们向结构传递3个指针,即3*8字节=24字节。也许这样更有效

  • 使用C99标准库中的复杂类型:
  • 但关于C99复杂类型,我有一些不明白的地方。
    double complex
    实际上是如何传递到函数中并从函数返回的?它是否像第一个带有结构的变体一样按值复制


    我应该使用哪种变体?

    使用它的标准版本。它现在集成到编译器中,是您能得到的最好的

    How is double complex actually passed into function and returned from function?
    
    它们可以通过值进行访问,正如函数的规范所指示的那样,并且与任何其他函数参数的情况一样,除非它们具有数组类型

    保证复数与两个实数的向量具有相同的表示形式(=内存布局),但它们是正确的类型:

    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.
    

    尽管它们的字节模式与浮点值的两个元素向量相同,但它们与任何其他数字一样被视为算术类型。

    使用它的标准版本。它现在集成到编译器中,是您能得到的最好的

    How is double complex actually passed into function and returned from function?
    
    它们可以通过值进行访问,正如函数的规范所指示的那样,并且与任何其他函数参数的情况一样,除非它们具有数组类型

    保证复数与两个实数的向量具有相同的表示形式(=内存布局),但它们是正确的类型:

    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.
    

    虽然它们的字节模式与浮点值的两元素向量相同,它们被视为与任何其他数字一样的算术类型。

    当所有符合标准的C实现中已经有一个实现时,为什么还要创建自己的实现呢?选项4)升级到C++选项4)通过传递
    双复数*
    组合选项2和3。Andrew Henle,我只是想了解C99标准数据类型“双复数”是如何实际实现的。为什么在所有符合标准的C实现中都有一个实现时,您还要创建自己的实现呢?选项4)升级到C++选项4)通过传递
    double complex*
    组合选项2和3。Andrew Henle,我只是想了解C99标准数据类型“双复数”是如何实际实现的。C标准根本没有指定复数的表示形式。如果“双复数”是两个实数的向量,这是否意味着它是两个双复数的数组?但据我所知,数组是通过指针传递给函数的,而不是通过值。数组不能按值从函数返回。@Kostiantyn_Hermash它不是两个双精度数组,即使内存布局看起来像两个双精度数组。你的
    struct complex_double
    的内存布局看起来也像两个double的数组…@IanAbbott,这完全是错误的。我为此添加了一条C标准的引文。@Kostiantyn_Hermash,在浮点的表示/和/存在/向量相同方面有细微的区别。请看我的编辑。C标准根本没有规定复数的表示。如果“双复数”是两个实数的向量,这是否意味着它是两个双复数的数组?但据我所知,数组是通过指针传递给函数的,而不是通过值。数组不能按值从函数返回。@Kostiantyn_Hermash它不是两个双精度数组,即使内存布局看起来像两个双精度数组。你的
    struct complex_double
    的内存布局看起来也像两个double的数组…@IanAbbott,这完全是错误的。我为此添加了一条C标准的引文。@Kostiantyn_Hermash,在浮点的表示/和/存在/向量相同方面有细微的区别。请看我的编辑。
    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.