1

我必须返回两个复数之间的距离,我得到的错误是在返回行中显示“从 Complex* 到 double 的无效转换”。

double Complex::distance(const Complex &a, const Complex &b)
{
    Complex *number = new Complex();

    number->modificaRe(a.real() - b.real());
    number->modificaIm(a.imag() - b.imag());

    return (double)number;
}

你能告诉我我做错了什么吗?更不用说老师给我们这个函数的定义是“静态双精度”,但我又遇到了另一个错误,所以我只是删除了“静态”。

4

4 回答 4

2

问题是一个替身不能同时携带复数的实部和虚部。

我相信两个复数之间的距离是差异平方和的平方。

所以,你的代码应该是......

double Complex::distance(const Complex &a, const Complex &b)
{
  double number;

  double r = a.real() - b.real();
  double i = a.imag() - b.imag();

  number = sqrt(r*r + i*i);

  return number;
}

正如 H2CO3 指出的那样,使用 std::hypot 可能会更安全......所以

double Complex::distance(const Complex &a, const Complex &b)
{
  return std::hypot(a.real() - b.real(), a.imag() - b.imag());
}
于 2013-02-21T16:44:13.343 回答
1

最简单的解决方案是使用标准库的std::comlpex类模板。您可以使用减法并std::abs获得“距离”:

#include <complex>
#include <iostream>

template <typename T>
T complex_distance(const std::complex<T>& a, const std::complex<T>& b)
{
  return std::abs(b-a);
}

int main()
{
  std::complex<double> c1(-1,-1);
  std::complex<double> c2(2,2);
  std::cout << (c2-c1) << std::endl;
  std::cout << complex_distance(c2,c1) << std::endl;
}
于 2013-02-21T16:53:03.667 回答
1

如果我没记错的话,可以使用 pythagorus 计算距离 - 因此不需要在 distance() 中创建 Complex 对象。

double Complex::distance(const Complex &a, const Complex &b)
{    
    double x = a.real() - b.real();
    double y = a.imag() - b.imag();

    return sqrt(x * x + y * y);
}
于 2013-02-21T16:53:49.433 回答
0

不支持从指向 a 的指针强制转换为Complexa 。double甚至不清楚为什么要在此处创建指针而不是仅将其分配到堆栈上。

例如:

double Complex::distance(const Complex &a, const Complex &b)
{
    Complex number;

    number.modificaRe(a.real() - b.real());
    number.modificaIm(a.imag() - b.imag());

    return (double)number;
}
于 2013-02-21T16:42:09.037 回答