【发布时间】:2019-10-07 15:19:09
【问题描述】:
我决定尝试一下 complex.h,但遇到了一个我认为非常奇怪的问题。
int mandelbrot(long double complex c, int lim)
{
long double complex z = c;
for(int i = 0; i < lim; ++i, z = cpowl(z,2)+c)
{
if(creall(z)*creall(z)+cimagl(z)*cimagl(z) > 4.0)
return 0;
}
return 1;
}
int mandelbrot2(long double cr, long double ci, int lim)
{
long double zr = cr;
long double zi = ci;
for(int i = 0; i < lim; ++i, zr = zr*zr-zi*zi+cr, zi = 2*zr*zi+ci)
{
if(zr*zr+zi*zi > 4.0)
return 0;
}
return 1;
}
这些函数的行为不同。如果我们输入 -2.0+0.0i 和高于 17 的限制,后者将返回 1,这对于任何限制都是正确的,而前者将返回 0,至少在我的系统上是这样。 GCC 9.1.0,锐龙 2700x。
我这辈子都想不通这是怎么发生的。我的意思是,虽然我可能不完全理解 complex.h 在幕后是如何工作的,但对于这个特定的示例,结果应该像这样偏离是没有意义的。
在写作时,我注意到 cpowl(z,2)+c,并尝试将其更改为 z*z+c,这有所帮助,但是经过快速测试,我发现行为仍然不同。前任。 -1.3+0.1*I,lim=18。
我很想知道这是否特定于我的系统以及可能的原因是什么,尽管我完全清楚最相似的情况是我犯了一个错误,但是很遗憾,我找不到它.
--- 编辑---
最后是完整的代码,包括更改和修复。这两个函数现在似乎产生了相同的结果。
#include <stdio.h>
#include <complex.h>
int mandelbrot(long double complex c, int lim)
{
long double complex z = c;
for(int i = 0; i < lim; ++i, z = z*z+c)
{
if(creall(z)*creall(z)+cimagl(z)*cimagl(z) > 4.0)
return 0;
}
return 1;
}
int mandelbrot2(long double cr, long double ci, int lim)
{
long double zr = cr;
long double zi = ci;
long double tmp;
for(int i = 0; i < lim; ++i)
{
if(zr*zr+zi*zi > 4.0) return 0;
tmp = zi;
zi = 2*zr*zi+ci;
zr = zr*zr-tmp*tmp+cr;
}
return 1;
}
int main()
{
long double complex c = -2.0+0.0*I;
printf("%i\n",mandelbrot(c,100));
printf("%i\n",mandelbrot2(-2.0,0.0,100));
return 0;
}
cpowl() 仍然搞砸了,但我想如果我愿意,我可以创建自己的实现。
【问题讨论】:
标签: c complex-numbers