【发布时间】:2020-01-11 05:15:03
【问题描述】:
如果输入是复数a+bi 和real = a, imag = b,有人可以帮我理解这个函数在做什么
我不知道它会计算什么,但也许我遗漏了一些明显的东西?
double function(double real, double imag)
{
double y;
double a;
double b;
a = fabs(real);
b = fabs(imag);
if (a < b)
{
a /= b;
y = b * sqrt(a * a + 1.0);
}
else if (a > b)
{
b /= a;
y = a * sqrt(b * b + 1.0);
}
else if (b == NAN)
{
y = b;
}
else
{
y = a * sqrt(2);
}
return y;
}
【问题讨论】:
-
只是
abs(),绝对值。sqrt(real^2 + imag^2)。不清楚为什么会这样混淆。 -
@IgorTandetnik:它没有被混淆。它正在避免溢出。
-
根据
real或imag是否为 NAN,生成函数结果的路径似乎很奇怪(尽管如果a为 NAN,y = a * sqrt(2);确实会产生 NAN一个南)。<math.h>中还有一个isnan()函数。使用它比使用b == NAN测试要好,因为 NAN 有多种表示形式。 -
计算复数值
(real, imag)的大小并跳过一些简单的循环以避免溢出。 -
@JonathanLeffler 它们是不同的,因为最后一个分支不仅涵盖
a == NAN,还涵盖a==b。所以最后两个分支等同于if(b== NAN) {return NAN;} else if(a == NAN) {return NAN;} else { return sqrt(2)*a; /* only is reached for a==b*/},并且这个表示的最后两个分支只是一个。
标签: c++ c function math complex-numbers