C复数和printf
Posted
技术标签:
【中文标题】C复数和printf【英文标题】:C complex number and 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;
..我应该使用什么转换说明符(或其他东西)来代替“???”
【问题讨论】:
【参考方案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)>=0.0f)? '+':'\0',cimag(c))
@JonDoe 没关系。 printf 不是 scanf,f 和 lf 都可以用于双精度。见***.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*)&D+1));
【参考方案4】:
使用 GNU C,这是可行的:
printf("%f %f\n", complexnum);
或者,如果您想在虚部之后打印“i”后缀:
printf("%f %fi\n", complexnum);
【讨论】:
我不认为这是真的:wandbox.org/permlink/h7O5hbDp0FzxKtXc 看看另一个answer 看看为什么它可能会起作用。 未定义的行为是未定义的以上是关于C复数和printf的主要内容,如果未能解决你的问题,请参考以下文章