# Java- Werte - Leibniz'sche Zahlenreihe



## Developer_X (23. Mai 2009)

Hi, ich hab grad 
die Leibniz'sche Zahlenreihe
in der Schule gelernt, und sie in Java visualisiert,
das besondere an ihr ist, für alle die das nicht wissen:
1/1-1/3+1/5-1/7...
der nenner wird von Bruch zu Bruch um 3 Addiert, zwischen den Brüchen wird mit + und - abwechselt.
Nun, wenn man das hier, genauer macht, und das ergebnis davon mal 4 nimmt, hat man PI.
Hier mein Quellcode:

```
package MainClasses;

public class LeibnizscheZahlenReihe 
{
	public static void main(String[]args)
	{
		double zahl = 0;
		double x = 1;
		boolean b = false;
		
		System.out.println("Die Leibnizsche Zahlenreihe");
		System.out.println("Die ersten Tausend Schritte");
		
		int i = 1;
		while(i<=1000)
		{
			if(b==false)
			{
				zahl=zahl+(1/x);
				b = true;
				System.out.println("zahl + (1/"+x+")"+"  PI=zahl*4 == "+zahl*4);
			}
			else if(b== true)
			{
				zahl=zahl-(1/x);
				b = false;
				System.out.println("zahl - (1/"+x+")"+"  PI=zahl*4 == "+zahl*4);

			}
			i++;
			x = x + 2;
		}
	}
}
```
auf jeden fall,
Wie ihr sehen könnt, habe ich double benutzt, weil dies ja nach meinen Tutorial zu Folge, 'doppelte Genauigkeit' ist.
Aber leider, werden nur die ersten 16 Zahlen nach dem Komma ausgegeben, kann mir einer von euch vielleicht helfen?

Vielleicht könntet ihr mir sagen, nur wenn das möglich ist, einen Wert zu programmieren, der mehr als nur 16 Zahlen nach dem Komma, zum Beispiel 32 o. mehr...?

Geht sowas`? Ich danke allen von euch für eine Antwort


----------



## Wildcard (23. Mai 2009)

BigDecimal


----------



## Developer_X (23. Mai 2009)

danke wildcard,
ich habs jetzt schon mermals versucht, BIGDECIMAL bringt mir gar nichts, weil man damit keine Operationen in sachen Rechnen machen kann, und das blöde ist, man muss die rechnung, erst von double zu String, und dann von String zu BigDecimal machen.
Der Fehler dabei, 
wenn man double verwenden muss, also nicht gleich dir Operationen mit BigDecmal machen kann, dann  muss ich ja dieses double verwenden, aber dieser Wert, ist dann schon gekürzt, bis auf die xte Stelle, das bringt mir also rein garnischts, könntest du mir bitte vielleicht nochmal helfen?


----------



## andre111 (23. Mai 2009)

:shock::shock::shock:
Dann sieh dir mal die Documentation von BigDecimal an.


----------



## faetzminator (23. Mai 2009)

Du musst gar keine double's verwenden, sondern *immer* BigDecimal. Und natürlich kann man diverse mathematische Operationen verwenden, z.B. BigDecimal (Java 2 Platform SE 5.0)


----------



## Ark (23. Mai 2009)

@Wildcard: Da hörst du es, du bringst "rein garnischts". Werd endlich mal ein Kind, Mann. 



Developer_X hat gesagt.:


> BIGDECIMAL bringt mir gar nichts, weil man damit keine Operationen in sachen Rechnen machen kann


Wie kommst du denn auf den Trichter? :autsch:

Ark


----------



## Developer_X (23. Mai 2009)

faetzminator hat gesagt.:


> Du musst gar keine double's verwenden, sondern *immer* BigDecimal. Und natürlich kann man diverse mathematische Operationen verwenden, z.B. BigDecimal (Java 2 Platform SE 5.0)



ach ja?...

```
package MATH;

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.math.BigDecimal;

import javax.swing.*;

@SuppressWarnings("serial")
public class LeibnizscheZahlenReihe extends JFrame
{
	public LeibnizscheZahlenReihe()
	{
		this.setTitle("LeibnizscheZahlenReihe");
		this.setSize(200,300);
		this.setLayout(new GridLayout(1,1));

		JMenuBar bar = new JMenuBar();
		this.setJMenuBar(bar);
		JButton rech = new JButton("Rechnen");
		bar.add(rech);
		
		final JTextArea area = new JTextArea();
		area.setBackground(Color.black);
		area.setForeground(Color.green);
		
		JScrollPane pane = new JScrollPane(area);
		this.add(pane);
		rech.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				b1ActionPerformed(evt);
			}
			
			private void b1ActionPerformed(ActionEvent evt)
			{
				BigDecimal zahl = new BigDecimal(getContents(new File("F:/Programms/PI4.sav")));
				BigDecimal x = new BigDecimal(getContents(new File("F:/Programms/Bruch.sav")));
				BigDecimal a1 = new BigDecimal("1.0");
				BigDecimal a2 = new BigDecimal("2.0");
				BigDecimal a4 = new BigDecimal("4.0");

				boolean b = false;
				
				area.append("\n"+"Die Leibnizsche Zahlenreihe");
				area.append("\n"+"Die ersten Tausend Schritte");
				
				int i = 1;
				while(i<=10000)
				{
					if(b==false)
					{
						zahl=zahl+(a1/x);
						b = true;
						area.append("\n"+"zahl + (1/"+x+")"+"  PI=zahl*4 == "+zahl*a4);
					}
					else if(b== true)
					{
						zahl=zahl-(a1/x);
						b = false;
						area.append("\n"+"zahl - (1/"+x+")"+"  PI=zahl*4 == "+zahl*a4);

					}
					i++;
					x = x + a2;
				}
				try {
					setContents(new File("F:/Programms/PI4.sav"),""+zahl);
				} catch (FileNotFoundException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				try {
					setContents(new File("F:/Programms/Bruch.sav"),""+x);
				} catch (FileNotFoundException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		});
		
		this.setVisible(true);
	}

	static public void setContents(File aFile, String aContents)
    throws FileNotFoundException, IOException {
		  if (aFile == null) {
			  throw new IllegalArgumentException("File should not be null.");
		  }
		  if (!aFile.exists()) {
			  throw new FileNotFoundException ("File does not exist: " + aFile);
		  }
		  if (!aFile.isFile()) {
			  throw new IllegalArgumentException("Should not be a directory: " + aFile);
		  }
		  if (!aFile.canWrite()) {
			  throw new IllegalArgumentException("File cannot be written: " + aFile);
		  }
		  Writer output = new BufferedWriter(new FileWriter(aFile));
		  try {
			  output.write( aContents );
		  }
		  finally {
			  output.close();
		  }
}
	  static public String getContents(File aFile) {
		    StringBuilder contents = new StringBuilder();  
		    try {
		      BufferedReader input =  new BufferedReader(new FileReader(aFile));
		      try {
		        String line = null; 
		        while (( line = input.readLine()) != null){
		          contents.append(line);
		        }
		      }
		      finally {
		        input.close();
		      }
		    }
		    catch (IOException ex){
		      ex.printStackTrace();
		    }
		    
		    return contents.toString();
		  }
	  public static void main(String[]args)
	  {
		  new LeibnizscheZahlenReihe();
	  }
}
```

[Exception]
Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
	The operator / is undefined for the argument type(s) java.math.BigDecimal, java.math.BigDecimal
	The operator * is undefined for the argument type(s) java.math.BigDecimal, java.math.BigDecimal
	The operator / is undefined for the argument type(s) java.math.BigDecimal, java.math.BigDecimal
	The operator * is undefined for the argument type(s) java.math.BigDecimal, java.math.BigDecimal
	The operator + is undefined for the argument type(s) java.math.BigDecimal, java.math.BigDecimal

	at MATH.LeibnizscheZahlenReihe.<init>(LeibnizscheZahlenReihe.java:55)
	at MATH.LeibnizscheZahlenReihe.main(LeibnizscheZahlenReihe.java:137)

[/Exception]


----------



## Schandro (23. Mai 2009)

Guck dir die API an, du musst Methoden zum rechnen benutzen, z.b. "add", "multiply" usw...


----------



## faetzminator (23. Mai 2009)

... hättest du dir die Beispielmethode in der API angesehen, zu welcher ich den Link kopierte, dann wüsstest du, dass es z.B. die Methode divide() gibt - erst noch mit mehreren Parametermöglichkeiten.


----------



## Noctarius (23. Mai 2009)

Manchmal bewundere ich Euch ja... Ihr gebt auch nicht auf, oder?


----------



## Lexi (23. Mai 2009)

Noctarius hat gesagt.:


> Manchmal bewundere ich Euch ja... Ihr gebt auch nicht auf, oder?


Die Hoffnung stirbt zuletzt ... ^^


----------



## icarus2 (23. Mai 2009)

Nur so als kleines Beispiel eine Methode, die die Fakultät für beliebig grosse Zahlen berechnen kann..

[Java]
public static BigInteger bigFact(int n){

    BigInteger bi = new BigInteger("1");

    while(n > 0){
      bi = bi.multiply(new BigInteger(""+n));
      n--;
    }

    return bi;  
  }
[/Java]


----------



## Schandro (23. Mai 2009)

> new BigInteger("1")


Benutz lieber
BigInteger.ONE
dafür.


----------



## icarus2 (24. Mai 2009)

Danke für den Tipp


----------



## Developer_X (24. Mai 2009)

oh thanks!


----------



## Developer_X (24. Mai 2009)

```
package MainClasses;

import java.math.BigDecimal;

public class CopyOfLeibnizscheZahlenReihe 
{
	public static void main(String[]args)
	{
		BigDecimal zahl = new BigDecimal("0");
		BigDecimal x = new BigDecimal("1");
		BigDecimal a1 = new BigDecimal("1");
		BigDecimal a2 = new BigDecimal("2");
		BigDecimal a4 = new BigDecimal("4");
		boolean b = false;
		
		System.out.println("Die Leibnizsche Zahlenreihe");
		System.out.println("Die ersten Tausend Schritte");
		
		int i = 1;
		while(i<=1000)
		{
			if(b==false)
			{
				zahl=zahl.add(a1.divide(x));
				b = true;
				System.out.println("zahl + (1/"+x+")"+"  PI=zahl*4 == "+zahl.multiply(a4));
			}
			else if(b== true)
			{
				zahl=zahl.subtract(a1.divide(x));
				b = false;
				System.out.println("zahl - (1/"+x+")"+"  PI=zahl*4 == "+zahl.multiply(a4));

			}
			i++;
			x = x.add(a2);
		}
	}
}
```
Wenn ich das Schreibe kommt folgende Exception, was mache ich diesmal falsch?

```
Die Leibnizsche Zahlenreihe
Die ersten Tausend Schritte
zahl + (1/1)  PI=zahl*4 == 4
Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
	at java.math.BigDecimal.divide(Unknown Source)
	at MainClasses.CopyOfLeibnizscheZahlenReihe.main(CopyOfLeibnizscheZahlenReihe.java:30)
```


----------



## andre111 (24. Mai 2009)

Du musst bei BigDecimal die Genauigkeit an Nachkommastellen, da nicht endlichen Dezimalzahlen ansonsten nicht dargestellt werden können, z.B. 1 / 3 = 0.333333...
Das sollte mit BigDecimal#setScale(int) funktionieren, bin mir aber gerade nicht sicher.


----------



## Developer_X (24. Mai 2009)

@andree11
also ich hab das mal umgeändert:

```
package MainClasses;

import java.math.BigDecimal;

public class CopyOfLeibnizscheZahlenReihe 
{
	public static void main(String[]args)
	{
		BigDecimal zahl = new BigDecimal("0");
		BigDecimal x = new BigDecimal("1");
		BigDecimal a1 = new BigDecimal("1");
		BigDecimal a2 = new BigDecimal("2");
		BigDecimal a4 = new BigDecimal("4");
		boolean b = false;
		
		System.out.println("Die Leibnizsche Zahlenreihe");
		System.out.println("Die ersten Tausend Schritte");
		
		int i = 1;
		while(i<=1000)
		{
			if(b==false)
			{
				zahl=zahl.add(a1.divide(x));
				b = true;
				BigDecimal ouais = null;
				ouais.setScale(10);
				ouais = zahl.multiply(a4);
				System.out.println("zahl + (1/"+x+")"+"  PI=zahl*4 == "+ouais);
			}
			else if(b== true)
			{
				zahl=zahl.subtract(a1.divide(x));
				b = false;
				BigDecimal ouais = zahl.multiply(a4);
				ouais.setScale(10);
				ouais = zahl.multiply(a4);
				System.out.println("zahl - (1/"+x+")"+"  PI=zahl*4 == "+ouais);

			}
			i++;
			x = x.add(a2);
		}
	}
}
```


```
Die Leibnizsche Zahlenreihe
Die ersten Tausend Schritte
Exception in thread "main" java.lang.NullPointerException
	at MainClasses.CopyOfLeibnizscheZahlenReihe.main(CopyOfLeibnizscheZahlenReihe.java:27)
```
Ich mach irgendwie wieder was falsch, doch bloß was?


----------



## Ark (24. Mai 2009)

Dein Fehler steht haargenau in der Fehlermeldung und im Quelltext beschrieben. Der Fehler ist so offensichtlich, dass man meinen könnte, du wolltest ein Beispiel liefern, wie man es _nicht_ machen sollte.

Erklär du zur Abwechslung doch mal _uns_ die Fehlermeldung! 

Ark


----------



## andre111 (24. Mai 2009)

???:L   ;(


----------



## Developer_X (24. Mai 2009)

Ark hat gesagt.:


> Dein Fehler steht haargenau in der Fehlermeldung und im Quelltext beschrieben. Der Fehler ist so offensichtlich, dass man meinen könnte, du wolltest ein Beispiel liefern, wie man es _nicht_ machen sollte.
> 
> Erklär du zur Abwechslung doch mal _uns_ die Fehlermeldung!
> 
> Ark



also, @Ark+AllRest
Dort wird gesagt, dass was mit der Zeile 27 nicht stimmt, und zwar mit "setScale" also ist  die wohl am falschen platzt, also muss ich sie irgendwo hinpositionieren um sie richtig zu haben, ist das nicht`so`?
Die Frage ist nur wohin, nicht wahr?


----------



## andre111 (24. Mai 2009)

ääääähhhmmm
*überleg*
*nachdenk*
*NEIN*

Informier dich mal was eine NullPointerException ist.


----------



## diggaa1984 (24. Mai 2009)

schau mal ne Zeile drüber und gugge was du in zeile 27 versuchst. Wenns ne statische Methode wäre OK, würde das gehen .. aber scheint wohl keine zu sein


----------



## Noctarius (24. Mai 2009)

Ok ein aller aller aller aller aller ... allerletzter Tipp von mir:

NullPointer bedeutet dass du versucht Methoden oder Fields oder Properties oder ... auf einer Variable auszuführen, abzurufen oder sonst das ding irgendwie zu vergewaltigen ohne das es instanziert wurde.
NullPointer mal gaaaaanz frei übersetzt steht für, wer hätte es gedacht, NullZeiger. Ein Zeiger auf die Speicherposition 0 die nicht exisitert. Zwangsweise kann man da auch nichts machen.

Und genau das ist der Unterschied zwischen NULL und Null (als Zahl):

```
Integer foo = null;
Variable foo vom Typ Integer an Speicherposition 0 mit Wert null.

Integer foo = 0;
Variable foo vom Typ Integer an Speicherposition xyz mit Wert 0.
```

So und jetzt überlegst du noch einmal was NullPointerException auf diese Erklärung oben hin bedeutet. Das Schlimmste ist ich glaube du weißt was eine NPE ist und ließt einfach die Stacktraces nicht wirklich sondern übergehst das genauso wie unsere Tipps und Anregungen...


----------



## Developer_X (24. Mai 2009)

Noctarius hat gesagt.:


> Ok ein aller aller aller aller aller ... allerletzter Tipp von mir:
> 
> NullPointer bedeutet dass du versucht Methoden oder Fields oder Properties oder ... auf einer Variable auszuführen, abzurufen oder sonst das ding irgendwie zu vergewaltigen ohne das es instanziert wurde.
> NullPointer mal gaaaaanz frei übersetzt steht für, wer hätte es gedacht, NullZeiger. Ein Zeiger auf die Speicherposition 0 die nicht exisitert. Zwangsweise kann man da auch nichts machen.
> ...




aso!!!!!1
Jetzt hab ich kapiert, ich kann erst "setValue" machen, wenn ich definiert habe, was diese BigDecimal Zahlen überhaupt sind, aber auch wenn ich dies mache kommt ein Fehler:

```
package MainClasses;

import java.math.BigDecimal;

public class CopyOfLeibnizscheZahlenReihe 
{
	public static void main(String[]args)
	{
		BigDecimal zahl = new BigDecimal("0");
		BigDecimal x = new BigDecimal("1");
		BigDecimal a1 = new BigDecimal("1");
		BigDecimal a2 = new BigDecimal("2");
		BigDecimal a4 = new BigDecimal("4");
		boolean b = false;
		
		System.out.println("Die Leibnizsche Zahlenreihe");
		System.out.println("Die ersten Tausend Schritte");
		
		int i = 1;
		while(i<=1000)
		{
			if(b==false)
			{
				b = true;

				zahl=zahl.add(a1.divide(x));
				BigDecimal ouais = zahl.multiply(a4);
				ouais.setScale(10);
				System.out.println("zahl + (1/"+x+")"+"  PI=zahl*4 == "+ouais);
			}
			else if(b== true)
			{
				b = false;

				zahl=zahl.subtract(a1.divide(x));
				BigDecimal ouais = zahl.multiply(a4);
				ouais.setScale(10);

				System.out.println("zahl - (1/"+x+")"+"  PI=zahl*4 == "+ouais);

			}
			i++;
			x = x.add(a2);
		}
	}
}
```


```
Die Leibnizsche Zahlenreihe
Die ersten Tausend Schritte
Exception in thread "main" zahl + (1/1)  PI=zahl*4 == 4
java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
	at java.math.BigDecimal.divide(Unknown Source)
	at MainClasses.CopyOfLeibnizscheZahlenReihe.main(CopyOfLeibnizscheZahlenReihe.java:36)
```


----------



## Civilazi (24. Mai 2009)

Setz die Genauigkeit VOR der Berechnung.


----------



## Gastredner (24. Mai 2009)

Ruf setScale() vielleicht mal auf, _bevor_ du die Multiplikation/Was-auch-immer startest...


----------



## Developer_X (24. Mai 2009)

dann kommt immer noch ne Exception:

```
package MainClasses;

import java.math.BigDecimal;

public class CopyOfLeibnizscheZahlenReihe 
{
	public static void main(String[]args)
	{
		BigDecimal zahl;
		BigDecimal x = new BigDecimal("1");
		BigDecimal a1 = new BigDecimal("1");
		BigDecimal a2 = new BigDecimal("2");
		BigDecimal a4 = new BigDecimal("4");
		boolean b = false;
		
		System.out.println("Die Leibnizsche Zahlenreihe");
		System.out.println("Die ersten Tausend Schritte");
		
		int i = 1;
		while(i<=1000)
		{
			if(b==false)
			{
				b = true;
				
				zahl = new BigDecimal("0");
				zahl.setScale(10);
				zahl=zahl.add(a1.divide(x));
				BigDecimal ouais = new BigDecimal("0");
				ouais.setScale(10);
				ouais = zahl.multiply(a4);
				System.out.println("zahl + (1/"+x+")"+"  PI=zahl*4 == "+ouais);
			}
			else if(b== true)
			{
				b = false;

				zahl = new BigDecimal("0");
				zahl.setScale(10);
				zahl=zahl.subtract(a1.divide(x));
				BigDecimal ouais = new BigDecimal("0");
				ouais.setScale(10);
				ouais = zahl.multiply(a4);

				System.out.println("zahl - (1/"+x+")"+"  PI=zahl*4 == "+ouais);

			}
			i++;
			x = x.add(a2);
		}
	}
}
```


```
Die Leibnizsche Zahlenreihe
Die ersten Tausend Schritte
zahl + (1/1)  PI=zahl*4 == 4
Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
	at java.math.BigDecimal.divide(Unknown Source)
	at MainClasses.CopyOfLeibnizscheZahlenReihe.main(CopyOfLeibnizscheZahlenReihe.java:40)
```


----------



## Gastredner (24. Mai 2009)

Auch bei a1 muss setScale() aufgerufen werden, sonst ist das Ergebnis immer noch eine unendliche Rechnung.

EDIT: Entschuldigung, falsch verstanden/Denkfehler. Fehlerursache hat Schandro richtig korrigiert.


----------



## Schandro (24. Mai 2009)

du musst "divide" als 2. Parameter den Rundungstyp mitgeben


----------



## Developer_X (24. Mai 2009)

Schandro hat gesagt.:


> du musst "divide" als 2. Parameter den Rundungstyp mitgeben



das von Gastredner konnte ich visualisieren, aber was du meinst hab ich net verstanden, kannst dus mir anhand eines kleinen Code Fragmentes zeigen?

Wie soll ich das denn mitgeben?


----------



## Noctarius (24. Mai 2009)

Developer_X hat gesagt.:


> Wie soll ich das denn mitgeben?



Les doch mal die verdammte JavaDoc und such nach einer Variante der Methode divide mit einem Parameter mehr als du sie benutzt.

Ich würde jetzt liebend gerne den Thread zu machen nur damit du gezwungen bist zu suchen -.-

Das gibt es doch nicht, dass jemand so wenig Selbstständigkeit an den Tag legt... Schmiert Mama dir auch die Brote und wäscht dir die Haare oder hat sie dir ne Beschreibung gemalt wie man das macht? -.-


----------



## Developer_X (24. Mai 2009)

so wenn ich den Code wie fóglt habe, werden nur im Ergebnis:
4 und -4 ausgegeben, und nicht 3.14...
warum?

```
package MainClasses;

import java.math.BigDecimal;

public class CopyOfLeibnizscheZahlenReihe 
{
	public static void main(String[]args)
	{
		BigDecimal zahl;
		BigDecimal x = new BigDecimal("1");
		BigDecimal a1 = new BigDecimal("1");
		a1.setScale(10);
		BigDecimal a2 = new BigDecimal("2");
		a2.setScale(10);
		BigDecimal a4 = new BigDecimal("4");
		a4.setScale(10);
		boolean b = false;
		
		System.out.println("Die Leibnizsche Zahlenreihe");
		System.out.println("Die ersten Tausend Schritte");
		
		int i = 1;
		while(i<=1000)
		{
			if(b==false)
			{
				b = true;
				
				zahl = new BigDecimal("0");
				zahl.setScale(10);
				zahl=zahl.add(a1.divide(x,2));
				BigDecimal ouais = new BigDecimal("0");
				ouais.setScale(10);
				ouais = zahl.multiply(a4);
				System.out.println("zahl + (1/"+x+")"+"  PI=zahl*4 == "+ouais);
			}
			else if(b== true)
			{
				b = false;

				zahl = new BigDecimal("0");
				zahl.setScale(10);
				zahl=zahl.subtract(a1.divide(x,2));
				BigDecimal ouais = new BigDecimal("0");
				ouais.setScale(10);
				ouais = zahl.multiply(a4);

				System.out.println("zahl - (1/"+x+")"+"  PI=zahl*4 == "+ouais);

			}
			i++;
			x = x.add(a2);
		}
	}
}
```


----------



## Morgyr (24. Mai 2009)

Warum? Weil 1*4 = 4 bzw. -1 * 4 = -1. Wenn du dir deinen Code mal genau anguckst, wüsstest du auch selber warum.

Für i = 1 gilt nach deinem Code folgendes:
zahl = 0
a1 = 1 und x = 1
a1 soll durch x geteilt werden : 1 / 1 = 1
das soll auf zahl addiert werden : 0 + 1 = 1

ouais = 0
a4 = 4;
ouais speichert das ergebnis von zahl * a4
also : ouais = 1 * 4 = 4

Da kann also nirgendswo 3,14 rauskommen, weil du nirgendswo ein PI-Konstante hast, die du irgendwo multiplizierst.
Bevor du dir jetzt PI selber einprogrammierst, guck dir mal die Klasse Math an.


----------



## Marco13 (24. Mai 2009)

Darum, dass man PI nicht braucht, geht es ja bei dem ganzen Gefrickel hier 

*das ganze mal abkürz*

```
// Von http://www.java-forum.org/java-basics-anfaenger-themen/83407-java-werte-leibnizsche-zahlenreihe-2.html
// (fast nichts mehr vom Original übrig ausser dem Klassennamen)

import java.math.BigDecimal;

public class CopyOfLeibnizscheZahlenReihe
{
    public static void main(String[]args)
    {
        BigDecimal result = new BigDecimal(0);
        int n = 10000;
        int precision = 100;

        System.out.println("Die Leibnizsche Zahlenreihe");
        System.out.println("Die ersten "+n+" Schritte");

        for (int i=0; i<=n; i++)
        {
            BigDecimal one = BigDecimal.ONE;
            BigDecimal div = new BigDecimal(i*2+1);
            BigDecimal addend = one.divide(div, precision, BigDecimal.ROUND_HALF_EVEN);
            if (i%2==0)
            {
                //System.out.println("Adding "+i+": "+addend);
                result = result.add(addend);
            }
            else
            {
                //System.out.println("Subtracting "+i+": "+addend);
                result = result.subtract(addend);
            }
            //System.out.println("result now "+result);
        }

        BigDecimal finalResult = result.multiply(BigDecimal.valueOf(4));
        System.out.println("Final result "+finalResult);
        System.out.println("Verify       "+Math.PI);
    }
}
```


----------



## Ark (24. Mai 2009)

Eine Kleinigkeit, die ich noch bemerken möchte: null steht eher für nichts als für die Zahl Null. Genauso erzeugt z.B. /dev/zero fortlaufend Nullen, während /dev/null eben das "Nichtsgerät" ist.

Ark


----------



## Spacerat (24. Mai 2009)

WAAAAAS? "/dev/null" ist ein "Nichtsgerät"? Ich dachte immer das ist das Backup-Device. Naja nun wunderts mich nicht mehr, dass meine Backups so schnell gehen und ich so wenig Bänder brauche. :lol:


----------

