porownywanie 2 liczb zespolonych

0

Stworzyłem klasę do działań na liczbach zespolonych, wykrzacza się w porównywaniu 2 liczb (Cannot invoke double on the primitive double), nie mam kompletnie pojęcia co skopałem, jakieś pomysły?


public class Complex {

	private double re;
	private double im;
	
	
	
	 public Complex(double x) {
	        re = x;
	        im = 0.0; }
	 
	 
	  public Complex(Complex c) {
		    re=c.re;
		    im=c.im;
	 
	  }
	 public Complex(double r, double i) {
	        re = r;
	        im = i;
	 }
	
	  
	 public Complex dodawanie(Complex c) {
	        return new Complex(re + c.re, im + c.im);
	
	 }
	
	
	 public Complex odejmowanie(Complex c) {
	        return new Complex(c.re - re, c.im - im);
	
	 }
	
	
	 public Complex mnozenie(Complex c) {
	        return new Complex(re * c.re - im * c.im,
	                           re * c.im + im * c.re);
	
	 }

	 public Complex dzielenie(Complex c) {
	        return new Complex(c.im*re -c.re*im / (c.re*c.re +re*re) );
	
	 }
	 
	
	 public String toString() {
	        return "(" + re + "+" + im + "i)";
	      }
	
	 public Complex porownanie(Complex c) {              
			String w="";
		

		
			if (c.im.equals(im)) {
				w=w+"Liczby sa identyczne. ";
			} else {
				w=w+"Liczby sa rozne. ";
			}
			if (c.re.equals(re)) {
				w=w+"Liczby sa identyczne";
			} else {
				w=w+"Liczby sa rozne";
			}
			System.out.println(w);
	 
				
	
	 
}}
0

nie jest możliwe porównanie dwóch liczb zmiennoprzecinkowych jako że zawsze masz strate wynikającą z błędów obcięcia i zaokrąglej
(znanny przyklad gdzie A=0.5 B=0.5 C=A/2 - B/2 -> C==0? Naaaaah)
Dziwne, że się z tym nie spotkałeś. Jest to typowy błąd programistyczny. Zamiast przyrównania ( if double==double) zastosuj przyrównanie z określoną dokładnością czyli

if(Math.abs(double1-double2)< pewna_zalozona_dokladnosc (np. 10e-10)) then liczby_są_równe (z dokładnością do 10e-10)

0

Akurat tu chodzi o coś innego. im i re są typami prostymi, nie obiektami. One nie mają metod, więc nie możesz użyć equals w tym wypadku. Użyj zwykłego ==, z tym, że zwróć uwagę na to o czym wspomina Antoniossss.

Dodatkowo ta Twoja metoda porownanie ma zwracac Complex, a nigdzie nie masz return'a. Pomijając fakt, że powinna zwracać boolean i nic nie wypisywać. Dodatkowo lepiej by było przeciążyć metodę equals.

0

private double re;
private double im;

kheh... a jak z zewnątrz klasy odczytać wartości re i im? Zrób te pola publiczne (tak, jest to uzasadniony przypadek), albo chociaż daj jakieś funkcje, które je zwracają.

1

Na początek jeżeli chcesz porównywać dwie liczby zmiennoprzecinkowe to warto opakować je w obiekty. Java od wersji 1.5 posiada autoboxing i warto tu z tego skorzystać. Wtedy można sobie nadpisać metodę equals z wykorzystaniem mechanizmów javy:

class Complex {

	private final Double re;
	private final Double im;

	public Complex(double re, double im) {
		this.re = re;
		this.im = im;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Complex other = (Complex) obj;
		if (im == null) {
			if (other.im != null)
				return false;
		} else if (!im.equals(other.im))
			return false;
		if (re == null) {
			if (other.re != null)
				return false;
		} else if (!re.equals(other.re))
			return false;
		return true;
	}

}

i aplikacja testowa:

public class App{
	public static void main(String[] args) {
		Complex a = new Complex(0.1d, 0.0);
		Complex b = new Complex(0.1d, 0.0);
		System.out.println(a.equals(b)); // true
	}
}

Kolejna sprawa to jak już wykonujesz operacje arytmetyczne w taki sposób, że tworzysz nowe obiekty to warto pola w klasie zrobić final. Dzięki temu jak już będziesz rozwijał tą klasę to unikniesz głupich błędów polegających na nadpisaniu wartości.

I na koniec w metodach wykonujących operacje warto w sposób kontrolowany wyrzucać NullPointerException, czyli dopisać sprawdzenia czy argument nie jest aby null i wyrzucać wyjątek z własnym komunikatem błędu.

0

dzięki za wyjaśnienie, myślę, że wszystko ogarnąłem, liczbę zespoloną w postaci trygonometrycznej r*[cos(fi]+i*sin(fi)], rozumiem, że najłatwiej będzie wykorzystać metody java.lang.Math, kompletnie nie mam pojęcia jak się do tego zabrać, jakieś podpowiedzi dla zielonego?

1

Jak znasz wzory to raczej nie powinieneś mieć z tym problemów. Warto jednak zdecydować się na jeden format zapisu jako główny, a drugi niech będzie formatem pomocniczym.

0
Koziołek napisał(a)

Jak znasz wzory to raczej nie powinieneś mieć z tym problemów. Warto jednak zdecydować się na jeden format zapisu jako główny, a drugi niech będzie formatem pomocniczym.

ocb z tym pomocniczym? rozumiem ze mam lecieć wzorami po kolei, tak?

0

Z doświadczenia z klasą Complex wiem, że przydatne są (dla każdego działania arytmetycznego) dwie metody, np.:

public Complex suma(Complex z,Complex w)
{
   return new Complex(w.x+z.x,w.y+z.y);
}
public Complex dodaj(Complex w)
{
  this.x+=z.x;
  this.y+=z.y;
  return this;
}

Warto też mieć dwa konstruktory:

  • podajemy część rzeczywistą i urojoną,
  • podajemy moduł i argument.
0

@bo, ale tu trochę trzeba inaczej podejść do problemu. Metoda suma(Complex, Complex) powinna zostać moim zadaniem wydzielona do osobnej klasy np. MathComplex ponieważ nie działa bezpośrednio na danym obiekcie Complex.

0

@Koziołek, zgoda. Można też zostawić metodę suma w klasie Complex, ale zrobić ją static. To jest rozwiązanie dla miłośników "dużych" klas.

0

Witam wszystkich jeszcze raz, moja klasa powoli się rozrasta i obecnie ma takie wygląd, wszystko jest dobrze oprócz funkcji trygonometrycznych, jakieś wskazówki dla zielonego?

plan mam taki:

  1. obliczam wartość bezwzględna z pierwiastka sumy kwadratów
 public double modul() {
	        return Math.hypot(im, re);
  1. obliczam cosinus
public double kos() {
	        return cos(re/modul());
  1. obliczam sinus
public double zin() {
	        return sin(im/modul());
  1. obliczam sumę sinusa i cosinusa
 public double sinkos() {
	      return (kos+zin);
  1. obliczam iloczyn modułu i sinkos
public double trygo() {
	       return modul()*sinkos();
  1. na koniec zwracam wartosc
public String trygonometryczna()  {                 
		    return "(trygon+"i")";
		  }
		  public void show() {
				System.out.println(trygonometryczna());
		  }

mam nadzieję, że teraz to trochę jaśniej przedstawiłem, i ktoś pomoże znaleźć błędy

0

//wygasł czas więc przepraszam za double

plan mam taki:

  1. obliczam wartość bezwzględna z pierwiastka sumy kwadratów
 public double modul() {
	        return Math.hypot(im, re);
  1. obliczam cosinus
public double kos() {
	        return cos(re/modul());
  1. obliczam sinus
public double zin() {
	        return sin(im/modul());
  1. obliczam sumę sinusa i cosinusa
 public double sinkos() {
	      return (kos+zin);
  1. obliczam iloczyn modułu i sinkos
public double trygo() {
	       return modul()*sinkos();
  1. na koniec zwracam wartosc
public String trygonometryczna()  {                 
		    return "(trygon+"i")";
		  }
		  public void show() {
				System.out.println(trygonometryczna());
		  }

mam nadzieję, że teraz to trochę jaśniej przedstawiłem, i ktoś pomoże znaleźć błędy

1 użytkowników online, w tym zalogowanych: 0, gości: 1