Floats vergleichen

Status
Nicht offen für weitere Antworten.

Developer_X

Top Contributor
Ich habe mir die API durchgelesen und heraufgefunden dass die methode
compare heißt. aber wie soll ich diese methode in einem IF Satzt einbauen?
Java:
float f = 2;
if(f.compare(f,2))
{
System.out.println("ja");
}
So gehts nicht, und nur mit 2 in der klammer gehts auch nicht, also wie soll ich das anstellen?
 
ohne Kommentar
Java:
		float f1 = 235f;
float f2 = -235.12f;
System.out.println(f1==f2);
 
Boah kann ihm mal bitte einer die Grundlagen um die Ohren hauen? Also das hier ist mit viel Abstand das Übelste, was ich bisher von dir gesehen habe DevX... Das dir solche Fragen nicht peinlich sind ist alles...
 
dass das mit == wusste ich auch, mir ging eher darum das hier reinzupacken:
Java:
float f;

final Thread t1 = new Thread(){@Override public void run(){while(!isInterrupted()) {      	
//Background
f = f -0.0001f;
background.setColor(0,0,f);
try{sleep(1);}catch(InterruptedException e){interrupt();}}}};


final Thread t2 = new Thread(){@Override public void run(){while(!isInterrupted()) {      	
//Background
f = f +0.0001f;
background.setColor(0,0,f);
try{sleep(1);}catch(InterruptedException e){interrupt();}}}};

(new Thread(){@SuppressWarnings("deprecation")
@Override public void run(){while(!isInterrupted()) {   
	if(f== 2)
	{
		t2.stop();
		t1.start();
	}
	if(f== 0)
	{
		t1.stop();
		t2.start();
	}
try{sleep(1000);}catch(InterruptedException e){interrupt();}}}}).start();
Mit dieser Methode sollte eigentlich der float f mit thread 2 so erhöht werden, bis er 2 ist, dann soll mithilfe von Thread 1 der float f wieder so tief gemacht werden bis er null ist, versteht ihr?
Das will aber nicht ganz funktionieren. Es wird zwar hell, aber nicht mehr dunkler
 
float werden ungenau gerechnet,
nach 10.000x + 0.0001 ist f vielleicht 1.9999999976

entweder du errechnest die Differenz zwischen den zu vergleichen Zahlen und prüfst, ob z.B. größer -0.0000001 und kleiner 0.0000001

oder du verwendest in diesem Fall gleich int, starte bei 10.000, erhöhe um 1 bis 20.000 und wieder runter bis 10.000,
für die Color rechne aktueller Wert/10000d

ob das ganze Programm Sinn macht, ist noch ne andere Frage
 
ja, es macht sinn, wenn man einen Tages ablauf zeigen möchte, dann verstärkt sich das licht ja auch, und bis zum ende des tages verschwächt es wieder.
 
while(!isInterrupted()) {
if(f== 2)
{
t2.stop();
t1.start();
}
if(f== 0)
{
t1.stop();
t2.start();
}
1.) Du kannst jeden Thread max. 1 mal starten
2.) Die stop Methode ist unsicher und deprecated

Benutz z.b. Timer stattdessen
 
Ich habe mir die API durchgelesen und heraufgefunden dass die methode
compare heißt. aber wie soll ich diese methode in einem IF Satzt einbauen?

Völlig daneben lagst du nicht. Aber compare(float,float) gibt dir keinen boolean zurück, sondern ein int, den du auswerten musst.

EDIT: Auch wenn ich mir denken kann, was du meinst. Aber was bitte ist ein If-Satz. Ich glaube, die Frage hat dir schon mal jemand gestellt.
 
Zuletzt bearbeitet:
... Thread 1 der float f wieder so tief gemacht werden bis er null ist, versteht ihr? ...
Alles was von Object erbt kann null werden, ein Primitive Datatype kann es nicht.
Integer und Double erben von Object, int und double aber nicht.

Man versteht doch schon, dass hier die Zahl 0f gemeint ist. Warum soll man die Ziffer 0 hinschreiben, wo doch klar ist, was gemeint ist? Ich bin dafür, Zahlen bis 13 auszuschreiben.... Mit anderen Worten: Lasst ihn doch "null" auch bei nem float schreiben.
 
wenn wir hier in einem "Wie fütter ich meinen Goldfisch richtig"-Forum wären, würd ich dir zustimmen. In der Informatik ist 0 und null aber was unterschiedliches.. (vorallem da "null" english ist und deswegen nichts direkt mit der Zahl "0" zun tun hat)
 
Ganz ehrlich: Ich habe das "null" an dieser Stelle auch als 0 verstanden.

Aber das tut jetzt, glaube ich, weniger zur Sache.

@Dev_X: Mönsch, Mädel, was machst du denn?? 😱 Hat denn niemand eine Java-Fibel für dich?

Ark
 
also ich hab euren Rat mit dem Timer befolgt, und habe auch versucht das float, da es ja ungenau ist, umzuändern, geht aber leider nicht, weil die Methode von Java3D nur mit floats geht. Sorry, hier mein folgendes KSKB, ich gebe auch f aus, aber leider sinkt und steigt f nciht, wie gewünscht, zu 2, und sinkt auch nicht wieder zurück auf 0.

Java:
final float f = 0;
int delay = 1;  
	        int period = 1;  
	        final Timer timer = new Timer();      
	        timer.scheduleAtFixedRate(new TimerTask() {
	                public void run() 
	                {
	                	f = (int) (f -0.0001f);
	        	    	background.setColor(0,0,f);
	        	    }
	            }, delay, period);
	        int delay2 = 1;
	        int period2 = 1;  
	        final Timer timer2 = new Timer();      
	        timer2.scheduleAtFixedRate(new TimerTask() {
	                public void run() 
	                {
	                	f = (int) (f +0.0001f);
	        	    	background.setColor(0,0,f);
	        	    }
	            }, delay2, period2);	    	 
	    	 
	    	(new Thread(){@Override public void run(){while(!isInterrupted()) {   
	    		if(f<= 0)	    	
	    		{
	    	        timer.cancel();
	    	        timer2.purge();
	    	    }
	    		if(f>= 2)
	    		{
	    	        timer2.cancel();
	    	        timer.purge();
	    	    }
	    		System.out.println(f);
	    	try{sleep(1000);}catch(InterruptedException e){interrupt();}}}}).start();
Ich habe die Timer so wie aus meinem Coding beispiel aus ner website, eingetragen,
was mache ich denn noch falsch?

PS:
Ich wusste net wie man Timer startet, in der Api gab es wenigen methoden, und cancel hört sich wie stop bei threads an, und purge, vielleicht start

Ich vermute es liegt daran

@EDIT:
Ich habe den
java.util.Timer
benutzt
möglicher weise liegt es daran
 
Zuletzt bearbeitet:
> aber leider sinkt und steigt f nciht, wie gewünscht

final float f = 0;

wie soll sich denn bitte eine finale Variable ändern? 😉
auch noch über mehrere anonyme Klasse hinweg, das ist doch alles viel zu hoch für dich,

damit du etwas weiter kommst:
mache f zu einem Klassenattribut irgendwo, dann muss es nicht final sein und kann verändert werden,
oder verwende ein finales float[1] und ändere darin das erste Element

schöner wird es durch solche Workarounds aber bestimmt auch nicht
 
> aber leider sinkt und steigt f nciht, wie gewünscht

final float f = 0;

wie soll sich denn bitte eine finale Variable ändern? 😉
auch noch über mehrere anonyme Klasse hinweg, das ist doch alles viel zu hoch für dich,

damit du etwas weiter kommst:
mache f zu einem Klassenattribut irgendwo, dann muss es nicht final sein und kann verändert werden,
oder verwende ein finales float[1] und ändere darin das erste Element

schöner wird es durch solche Workarounds aber bestimmt auch nicht

also in meinem KSKB war f = final
aber in meinem Code ist f = static;
und oben in der Klasse verzeichnet

Noch was SlaterB,
ich seh mir grad die Videos von Java an, die mir hdi mal als tipp gegebn hat, und da wird darüber gesprochen wie dinge von anderen Klassen verwendet werden können.
6.2 Kapitel Objektorientierung in der Praxis - Teil 2
ein beispiel von vielen Vidoes

PS:
Ja ich hab mich bekehren lassen, und fülle meine Lücken, von den Java Kenntnissen.
Bitte keine blöden Kommentare dazu, ich versuchs außerdem mit dem WIKI artikel, noch mal, wenns dann nicht klappt, frag ich noch ma nach
 
geht immer noch nicht
ich hab mal im Wikipedia folgendes gesehen
Java:
 Timer timer = new Timer();

    // nach 1 Sek geht’s los und dann alle 5 Sekunden
      timer.schedule  ( new Task(), 1000, 5000 );
So und mein Timer sieht so aus:
Java:
  final Timer timer = new Timer();      
	                 timer.schedule(
new TimerTask() 
{
	                         public void run() 
	                         {
	                             f = (int) (f -0.0001f);
	                             background.setColor(0,0,f);
	                         }
	                     }, 
delay, period);
bei mir ist nur bei TimerTask() etwas anders, nämlich an meinem TimerTask ist eine run methode drangekoppelt, an der liegts ja nicht,
wie man Timer startet hab ich dort nicht gesehen, nur dass man Timer mit der Methode "cancel()" stoppt. siehe
Code:
Ein Timer kann abgebrochen werden, wenn die cancel()-Methode aufgerufen wird.
Hier brauch ich nochmal eure HIlfe,
wie kann ich einen Timer starten?
 
Hm... Google zweiter Eintrag (java wie kann ich einen timer starten? - Google-Suche)

How to Use Swing Timers (The Java™ Tutorials > Creating a GUI with JFC/Swing > Using Other Swing Features)
To start the timer, call its start method. To suspend it, call stop.

Java:
timer = new Timer(speed, this);
timer.setInitialDelay(pause);
timer.start();

Versteh auch nicht für was das run und so benötigt wird...

Ich verwende aber einen java.util.Timer
udn nicht einen java.swing.Timer
verstehst du
außerdem hättest du ne idee, wo man bei deinem Timer angeben kann, was passieren soll, während der Timer läuft?
 
Ich verwende aber einen java.util.Timer
udn nicht einen java.swing.Timer
verstehst du
außerdem hättest du ne idee, wo man bei deinem Timer angeben kann, was passieren soll, während der Timer läuft?

Ja OK. Habs grad gesehn ^^ Mein Fehler 🙂
Nö. Hab mit Timer noch nie was gemacht... :noe:
Bisher ham mir immer kleine Threads gereicht ^^
 
ok, bei mir ham threads auch imma gereicht, aber ich will diese stopen und starten können wann ich will, das ist grad mein Problem, nun haben die gesagt verwende Timer, und nun bin ich bei dem Problem das Timer anscheinend gar nicht gestartet wird
 
Hast Du den Beitrag von faetzminator überlesen oder geht das mit dem schedule(...) auch nich?
 
wenn die automatisch starten, haben die sich ja gegenseitg unnütze gemacht, aha.
So ich habs jetzt mal umgeändert:
Java:
		 final int delay = 1;  
	                 final int period = 1;  
	                 final Timer timer = new Timer();      	
	                 final Timer timer2 = new Timer();      
	             
	                  
	                 (new Thread(){@Override public void run(){while(!isInterrupted()) {   
	                     if(f<= 0)           
	                     {
                                     timer.cancel();
	                         timer2.schedule(new TimerTask() {
		                         public void run() 
		                         {
		                             f = (int) (f +0.0001f);
		                             background.setColor(0,0,f);
		                         }
		                     }, delay, period);        
	                     }
	                     if(f>= 2)
	                     {
                                      timer2.cancel();
	                         timer.schedule(new TimerTask() {
		                         public void run() 
		                         {
		                             f = (int) (f -0.0001f);
		                             background.setColor(0,0,f);
		                         }
		                     }, delay, period);
	                     }
	                   
	                 try{sleep(1000);}catch(InterruptedException e){interrupt();}}}}).start();
funktioniert aber leider auch nicht, why?
 
Zuletzt bearbeitet:
ja, hab ich auch schon mal ausprobiert, ging nicht, dann habe ich die dinger zum stoppen, weggemacht, und dann
den Code gepostet, daran liegts leider auch nciht
 
Ich bin mir nicht sicher, ob ich richtig verstanden habe, was du eigentlich willst. Wolltest du deine float f solange schrittweise erhöhen, bis sie einen bestimmten Wert erreicht hat und dannach wieder schrittweise verkleinern? Und das ganze sollte in einem eigenen Thread ablaufen? Das kann man doch relativ simple realisieren:

Java:
		new Thread(){
        	public void run(){
        		
        		float f = 0;
        		boolean temp = false;
            	
        		while (true){

            		if(f <= 2 && !temp){
            			f= f+0.0001f;
            		}else{
            			temp = true;
            		}
            		
            		if(f >= 0 && temp){
            			f= f-0.0001f;
            		}else{
            			temp = false;
            		}
            		
            		System.out.println(f);
            		
            		try {
						sleep(1);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
            	}
        	}
        }.start();
 
Oh danke, das funktioniert.
Man ich hatte mich zu fest auf meine eigentliche Idee konzentriert, dass ich das ganze auch mit hilfe von booleans hätte tun können.

Diese Logik hat mir an dieser Stelle gefehlt, danke an dich cover, und an alle anderen, die mir etwas versucht haben zu helfen..

🙂 Danke wirklich danke! 🙂
 
Zuletzt bearbeitet:
ch wollte nähmlich dass wenn dieser Wert f 2 erreicht hat, wieder zurück auf 0 kommt, wenn er dort angekommen ist soll er wieder den wert 2 erreichen usw...
Ha? :bahnhof: Genau das macht doch meine Methode: f steigt auf 2, fällt auf 0, steigt auf 2, fällt auf 0, usw. solange der Thread nicht gestoppt wird.

EDIT: Inzwischen hat er es auch gemerkt. :applaus:
 
Blödsinn! In C/C++ bedeutet 0 auch null. Also nicht gleich von der gesamten Informatik reden, wenn man selbst nur eingeschränkte Kenntnisse hat - okay?

Naja, null repräsentiert keinen Wert, aber 0 tut das (hat einen Wert). Diese Aussage gilt in der gesamten Informatik. Dann wird in C/C++ die Bedeutung von 0 wohl ambig sein.
 
ich würd mal einen breakpoint in die run methode setzen. Weil so wie er da steht sollte er starten.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben