# Floats vergleichen



## Developer_X (28. Apr 2009)

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?

```
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?


----------



## Schandro (28. Apr 2009)

ohne Kommentar

```
float f1 = 235f;
float f2 = -235.12f;
System.out.println(f1==f2);
```


----------



## Noctarius (28. Apr 2009)

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...


----------



## Developer_X (28. Apr 2009)

dass das mit == wusste ich auch, mir ging eher darum das hier reinzupacken:

```
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


----------



## SlaterB (28. Apr 2009)

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


----------



## Developer_X (28. Apr 2009)

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.


----------



## Schandro (28. Apr 2009)

> while(!isInterrupted()) {
> if(f== 2)
> {
> t2.stop();
> ...


1.) Du kannst jeden Thread max. 1 mal starten
2.) Die stop Methode ist unsicher und deprecated

Benutz z.b. Timer stattdessen


----------



## SlaterB (28. Apr 2009)

noch einfacher:
if(f>= 2)
statt
if(f== 2)


----------



## cover1012 (28. Apr 2009)

Developer_X hat gesagt.:


> 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.


----------



## Noctarius (28. Apr 2009)

> ... Thread 1 der float f wieder so tief gemacht werden bis er null ist, versteht ihr? ...
> 
> 
> 
> ...


----------



## Civilazi (28. Apr 2009)

Noctarius hat gesagt.:


> > ... Thread 1 der float f wieder so tief gemacht werden bis er null ist, versteht ihr? ...
> >
> >
> >
> > ...


----------



## Schandro (28. Apr 2009)

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)


----------



## Ark (28. Apr 2009)

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


----------



## diggaa1984 (29. Apr 2009)

ich find den Code-Stil (#4) viel lustiger als die eigentliche Frage ... das is echt n schock


----------



## faetzminator (29. Apr 2009)

er hat leider den Vorteil von

```
[ctrl] + [shift] + [f]
```
noch nicht erkannt...


----------



## Developer_X (29. Apr 2009)

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.


```
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


----------



## cover1012 (29. Apr 2009)

Developer_X hat gesagt.:


> 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



Benutz doch mal die Mittel, die dir zur Verfügung stehen. Es gibt doch noch andere Quellen, als nur die API; z.B. hier:
Java ist auch eine Insel – 9.13 Die Klassen Timer und TimerTask


----------



## SlaterB (29. Apr 2009)

> 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


----------



## Developer_X (29. Apr 2009)

SlaterB hat gesagt.:


> > aber leider sinkt und steigt f nciht, wie gewünscht
> 
> final float f = 0;
> 
> ...



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


----------



## Developer_X (29. Apr 2009)

geht immer noch nicht
ich hab mal im Wikipedia folgendes gesehen

```
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:

```
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

```
Ein Timer kann abgebrochen werden, wenn die cancel()-Methode aufgerufen wird.
```
Hier brauch ich nochmal eure HIlfe,
wie kann ich einen Timer starten?


----------



## MiDniGG (29. Apr 2009)

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.


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

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


----------



## faetzminator (29. Apr 2009)

der startet nach Definition mit Hilfe von schedule() automatisch nach <delay> ms


----------



## Developer_X (29. Apr 2009)

MiDniGG hat gesagt.:


> 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.
> ...



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?


----------



## MiDniGG (29. Apr 2009)

Developer_X hat gesagt.:


> 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 ^^


----------



## Developer_X (29. Apr 2009)

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


----------



## MiDniGG (29. Apr 2009)

Hast Du den Beitrag von faetzminator überlesen oder geht das mit dem schedule(...) auch nich?


----------



## Developer_X (29. Apr 2009)

oh überlesen, sorry


----------



## Developer_X (29. Apr 2009)

wenn die automatisch starten, haben die sich ja gegenseitg unnütze gemacht, aha.
So ich habs jetzt mal umgeändert:

```
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?


----------



## Schandro (29. Apr 2009)

Kenn mich mit TimerTask net aus, aber stoppst du die irgendwann auchmal?


----------



## Developer_X (29. Apr 2009)

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


----------



## cover1012 (29. Apr 2009)

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:


```
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();
```


----------



## Developer_X (29. Apr 2009)

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!


----------



## cover1012 (29. Apr 2009)

Developer_X hat gesagt.:


> 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:


----------



## Jango (29. Apr 2009)

Schandro hat gesagt.:


> In der Informatik ist 0 und null aber was unterschiedliches..



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?


----------



## Noctarius (29. Apr 2009)

Jango hat gesagt.:


> 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?



Wo wir gleich beim Thema sind, besser selbst nachschauen 

In C:
#define NULL ((void*)0)

In C++:
#define NULL 0


----------



## cover1012 (29. Apr 2009)

Jango hat gesagt.:


> 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.


----------



## faetzminator (29. Apr 2009)

null repräsentiert schon 0, aber als Speicheraddresse


----------



## Vayu (30. Apr 2009)

ich würd mal einen breakpoint in die run methode setzen. Weil so wie er da steht sollte er starten.


----------

