【问题标题】:In C, How can I compare Complex Numbers as with <, >, et cetera在 C 中,如何将复数与 <、> 等进行比较
【发布时间】:2021-01-29 18:21:18
【问题描述】:

我在编译简化的 mandelbrot 函数时不断收到此错误消息。

main.c:86:43: 错误:二进制操作数无效 >(具有“复双精度”和“复浮点”) 否则 if(f2r > 1000 || f2i > 1000 * I) {

........^

还有其他消息,但都是同一个问题。

前几天我几乎刚刚开始编码,只是我对 complex.h 包还不够熟悉,无法自己解决......正如我所看到的 - 所以我决定问。

提前致谢。

【问题讨论】:

标签: c compiler-errors complex-numbers complex.h


【解决方案1】:

您似乎正在尝试将复数的实部与实数进行比较,将复数的虚部与虚数进行比较。比较运算符似乎不支持复数的比较。但是,您可以拼出复数值的虚部并进行比较。

double cimag(double complex d) 函数将返回一个复数值的虚部,以便您进行比较,因此请尝试以下操作:

else if(f2r > 1000 || cimag(f2i) > 1000) {

【讨论】:

  • 该解决方案有效地删除了错误消息,但是没有显示输出 - 只是黑屏和闪烁。该函数基于 100 次迭代限制(以及实部或虚部是否在该时间内达到上限)。如果最终达到那么高,可能 100 次迭代的函数会花费很长时间吗?这可能是我没有得到输出的原因。编译过程仍在运行——“停止”按钮可用。我认为您的解决方案很好,但现在我正处于解决问题的下一个阶段。非常感谢!
  • 100 次迭代并不是很多。 CPU 每秒运行数十亿次操作。
【解决方案2】:

比较复数值的一种方法是作为其模数。所以你可以使用以下公式:

模数 = sqrt(r * r + i * i)

然后你比较两个值。

【讨论】:

  • 有一个求模函数,cabs
  • sqrt(r * r + i * i) 在中间计算中容易溢出,即使结果是有限的。也许cabs(x + iy)hypot(x, y)?其中任何一个都可能溢出,但高质量的实现不会那么容易溢出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-13
  • 1970-01-01
  • 2021-12-28
  • 2014-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多