# Meine arctan-Methode geht nicht



## Raumsonde (29. Apr 2010)

In Java ME gibt es ja keine arctan-Funktion.

Habe versucht, meine eigene zu schreiben nach dem, was hier:
Inverse trigonometric functions - Wikipedia, the free encyclopedia
unter "Continued fraction for arctangent" steht.

Mein Versuch:

```
public class TestKlasse {
	static double arctan(double z)
	{
	 if ( z==0 ) return 0;
         double Nenner6teEbene;
	 double Nenner5teEbene;
	 double Nenner4teEbene;
	 double Nenner3teEbene;
	 double Nenner2teEbene;
	 double Nenner1teEbene;
	 double Endergebnis;
	 double z_quadrat;
	 
	 //continued fraction for arctangent
	 z_quadrat = z*z;
	 Nenner6teEbene = 11 + (36*z_quadrat)/13;
	 Nenner5teEbene = 9  + (25*z_quadrat)/Nenner6teEbene;
	 Nenner4teEbene = 7  + (16*z_quadrat)/Nenner5teEbene;
	 Nenner3teEbene = 5  + ( 9*z_quadrat)/Nenner4teEbene;
	 Nenner2teEbene = 3  + ( 4*z_quadrat)/Nenner3teEbene;
	 Nenner1teEbene = 1  + ( 1*z_quadrat)/Nenner2teEbene;
	 Endergebnis    = 0  + (   z        )/Nenner1teEbene;
	 
	 return Endergebnis;	
	};
```

Doch die Ausgabe:

```
public static void main (String argv[])
	  {
	     //System.out.println("Hello World!");
	     for (int i=10;i<=100;i=i+10)
	     {
	      System.out.println("arctan von "+i+":  "+arctan(i));	 
	     }
	     System.out.println("arctan von 0.5:  "+arctan(0.5));
	  }
```

liefert:


```
arctan von 10:  2.372521980541964
arctan von 20:  4.3262544536273175
arctan von 30:  6.367850287305142
arctan von 40:  8.4332129693478
arctan von 50:  10.508270843292705
arctan von 60:  12.588215645729225
arctan von 70:  14.670964602845421
arctan von 80:  16.7554704191579
arctan von 90:  18.841149288535433
arctan von 100:  20.927650155827695
arctan von 0.5:  0.4636476102024936
```

Wenn ich das mit den Ergebnissen meines Taschenrechners vergleiche,
hat das wenig mit der Realität zu tun.

Wo liegt der Fehler in meinem Code?


----------



## Marco13 (29. Apr 2010)

In Radians rechnen

```
for (int i=10;i<=100;i=i+10)
         {
          System.out.println("arctan von "+i+":  "+arctan(Math.toRadians(i))+" math "+Math.atan(Math.toRadians(i)));
         }
```


----------



## eRaaaa (29. Apr 2010)

Gibts *glaube* ich in Me auch nicht...da gibt`s soweit ich weiß nur abs,max und min
-->

```
static final double PI = 3.14159265358979323846;

	static double toRadians(double d){
		return d / 180.0 * PI;
	}
```


----------



## Raumsonde (30. Apr 2010)

(@Raaaa Bei mir ist toRadians in ME enthalten.)

Für Werte von z zwischen 0 und 1 funktioniert meine Funktion/Methode dahingehend, dass sie
den Tangens berechnet (statt den Arcustangens, den ich haben will).

Meine Ausgabe habe ich mit toRadians angepaßt:

```
public static void main (String argv[])
	  {
	     double t = 0;
		 for (int i=0;i<=10;i=i+1)
	     {
 	      //liefert Tangens statt ArcusTangens, z muß 0<=z<=1 sein:
	      System.out.println("arctan von "+t+":  "+arctan(Math.toRadians(t)));
	      t = t + 0.1;
	     }
	  }
```

Ausgabe:


```
arctan von 0.0:  0.0
arctan von 0.1:  0.0017453274798052572
arctan von 0.2:  0.0034906443265538163
arctan von 0.30000000000000004:  0.005235939907577654
arctan von 0.4:  0.006981203590986054
arctan von 0.5:  0.008726424746054185
arctan von 0.6:  0.010471592743611546
arctan von 0.7:  0.012216696956430302
arctan von 0.7999999999999999:  0.013961726759613411
arctan von 0.8999999999999999:  0.01570667153098255
arctan von 0.9999999999999999:  0.01745152065146582
```

Das ist aber jeweils der Tangens.
Was muß ich noch ändern, damit ich den Arcustangens bekomme?


----------



## Raumsonde (30. Apr 2010)

Ich habe jetzt mal die Methode static public double atan(double x) von
Calling atan function on Blackberry 4.2 JDE - Stack Overflow
in mein Programm übernommen.

Allerdings liefert meine Ausgabe wieder den Tangens statt den Arcustangens!:


```
double t = 0;
for (int i=0;i<=10;i=i+1)
	     {
	      //liefert Tangens statt ArcusTangens, aber z muß 0<=z<=1 sein:
	      System.out.println("arctan von "+t+":  "+atan(Math.toRadians(t))); //atan übernommen aus URL (siehe Text)
	      t = t + 0.1;
	     }
```

Ist mein Code und auch der übernommene falsch oder habe ich irgendeinen Denkfehler?


----------



## Raumsonde (30. Apr 2010)

Da ich meine Methode vorläufig mit Java SE teste, konnte ich auch testen,
was bei


```
System.out.println("arctan von "+t+":  "+ Math.atan(Math.toRadians(t)));
```

herauskommt.

Beispiel: t=0,5 -> Math.atan(Math.toRadians(t)) ergibt 0.008726424746054184.
Das ergibt auch mein Programm.
Mein "richtiger" Taschenrechner ergibt aber bei 0.5 (tan hoch -1) -> 26.56505118
und der Windowstaschenrechner "wissenschaftliche Ansicht" ergibt bei 0.5
Häkchen bei Feld "Inv" gemacht und dann "tan" gedrückt: 26,565051177077989351572193720453.

Ich glaube mein Denkfehler lag darin, dass ich dachte, arctan wäre tan hoch -1 bzw. der inverse Tangens,
aber Arcustangens doch etwas anderes ist.

Da mein Programm dasselbe ergibt wie Math.atan (aus Java SE), gehe ich davon aus, das es richtig funktioniert
und ich nur falsche Funktionen zum Vergleich herangezogen habe.
Danke für die Hilfe.


----------



## Marco13 (30. Apr 2010)

Du wirfst immernoch Radians und Grad durcheinander....


----------

