【问题标题】:C complex number and printfC复数和printf
【发布时间】:2010-11-04 17:31:08
【问题描述】:

如何打印(使用 printf )复数?例如,如果我有这个代码:

#include <stdio.h>
#include <complex.h>
int main(void)
{
    double complex dc1 = 3 + 2*I;
    double complex dc2 = 4 + 5*I;
    double complex result;

    result = dc1 + dc2;
    printf(" ??? \n", result);

    return 0;
}

..我应该使用什么转换说明符(或其他东西)来代替“???”

【问题讨论】:

    标签: c printf complex-numbers


    【解决方案1】:
    printf("%f + i%f\n", creal(result), cimag(result));
    

    我认为 C99 复杂类型没有特定的格式说明符。

    【讨论】:

    • 我在这里可能是错的,但是由于 creal() 和 cimag() 都返回双精度,格式说明符不应该是 '%lf' 而不是简单的 '%f'?
    • 附加改进 - 对虚部符号作出反应的宏:#define printfc(c) printf("%f%c%fi",creal(c),(cimag(c)&gt;=0.0f)? '+':'\0',cimag(c))
    • @JonDoe 没关系。 printf 不是 scanf,f 和 lf 都可以用于双精度。见stackoverflow.com/questions/210590/…
    • @AgniusVasiliauskas 你知道%c 也会输出\0吗?更好地使用 %s? "+" : ""
    【解决方案2】:

    %+f为虚部选择正确的符号:

    printf("%f%+fi\n", crealf(I), cimagf(I));
    

    输出:

    0.000000+1.000000i
    

    注意i 在末尾。

    【讨论】:

      【解决方案3】:

      因为复数是作为两个实数在内存中背靠背存储的,所以

      printf("%g + i%g\n", result);
      

      也可以,但会使用 gcc 生成编译器警告,因为参数的类型和数量与格式不匹配。我在调试时会在紧要关头这样做,但不要在生产代码中这样做。

      【讨论】:

      • 我认为在调试时依赖未定义的行为是一个坏主意。未定义的行为通常会导致其他细微的错误,从而加剧问题。此外,一次性调试代码最终投入生产是很常见的。
      • 这只有在平台的调用约定指定复数以与两个实数相同的方式传递时才有效,这绝不能保证。
      • 然而,它仅用于调试,相当不错的 hack。谢谢你的想法。
      • 当前使用带有 _Complex 的编译器,但没有别的。以更安全的方式在 mem 中使用背靠背:printf("%f%+fi\n", (double)D, *((double*)&amp;D+1));
      【解决方案4】:

      使用 GNU C,这是可行的:

      printf("%f %f\n", complexnum);
      

      或者,如果您想在虚部之后打印“i”后缀:

      printf("%f %fi\n", complexnum);
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-26
      • 1970-01-01
      • 2020-08-12
      • 2015-05-24
      • 2020-05-23
      • 2017-02-28
      • 2011-06-19
      • 1970-01-01
      相关资源
      最近更新 更多