1

2つの複素数の間の距離を返す必要があります。得られるエラーは、「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;
}

私が間違っているのは何ですか?先生がこの関数の定義を「staticdouble」と言ったことは言うまでもありませんが、別のエラーが発生したため、「static」を削除しました。

4

4 に答える 4

2

問題は、doubleがComplexの実数部と虚数部の両方を運ぶことができないことです。

2つの複素数の間の距離は、差の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...soを使用するのは後のことかもしれません。

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

ポインタからaComplexへのキャスト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 に答える