# Mit double und BigDecimal rechnen



## Purist (24. Nov 2008)

Heyho...Ich hab neu mit Java angefangen und hätte da mal ne Frage:

Und zwar muss ich näherungsweise einen Funktionswert f(x) berechnen, wobei sich das über ne Summenformel ergibt...hier zählt also ne Variable hoch im Prinzip von 0 bis unendlich, aber wir sagen halt dass die Schleife aufhörn soll wenn die Differenz zweier aufeinanderfolgenden Summanden kleiner als ein bestimmter vorgegebener Wert ist.
Die einzelnen Summenden berechne ich durch double-werte, das Problem is nur, dass da stark ansteigende Potenzen und Fakultäten drin sind...deshalb is double wohl nich so gut ^^ ausserdem wird der Näherungswert dann immer viel zu schnell aufgerundet.

Daher meine Frage: Wie kann ich das ganze genauer rechnen? Hab gehört dass BigDecimal wesentlich genauer sein soll, leider weiss ich nur net, wie ich das jetz umschreiben kann und diesen anderen Typ verwenden kann...

Bitte um Hilfe; Dankeschön ^^


...hier nebenbei die genaue Aufgabenstellung:

f(x) = sigma(voni=0 bis unendlich) über: (-1)^i * ( (2^i * x^2i) / (2i)! )

Das ganze soll aufsummiert werden bis sich der Wert der Summe nur noch um weniger als epsilon (hier 1.0E-8) ändert.
Die Funktionen für "hoch" und "Fakultät" hab ich selbst geschrieben; mit return = double.


----------



## SlaterB (24. Nov 2008)

die Grundlagen zu BigDecimal musst du schon in einem Lehrbuch lesen,
anders macht das keinen Sinn
http://openbook.galileocomputing.de/javainsel7/javainsel_05_007.htm

-----

spitzfindig sei noch angemerkt: wenn man durch Potenzen und Fakultät den double-Wertebereich verläßt,
ist es manchmal auch nicht weit bis zum Ende des BigDecimals-Bereichts, welcher nur durch den Arbeitsspeicher begrenzt ist (immerhin grob 64 MB statt 8 Byte) 

manchmal ist es zielführender, sparsamer zu rechnen,
Beispielweise läßt sich 400!/395! auch recht genau in double rechnen, wenn man nur kürzt

ist bei deiner Formel etwas schwieriger, aber wollte ich nur allgemein erwähnen


----------



## Guest (24. Nov 2008)

Also das mit dem Runden weiss ich...Hab auch schon versucht mir was zu überlegen wie ich das gescheit kürzen könnte aber mir is einfach nix eingefallen, zumindest nix was nich nen Aufwand von zig zeilen hätte xD

Und das mit den Grundlagen zu lernen versuch ich ja...Aber das is garnet so einfach xD
Ich hab hier z.b. nun:


```
BigDecimal ergebnis = new BigDecimal("1");
ergebnis = ergebnis.multiply (x);
```

das x is double (is ne Eingabe..)
und dann sagt er mir:  Cannot find symbol - method multiply (double)


...Was sagt mir das jetzt? Ich weiss echt nich weiter wie ich da vorgehn soll xD Sry


----------



## Ark (24. Nov 2008)

x müsste vom Typ BigDecimal sein, wenn ich richtig liege. Das steht aber alles genau in der API-Dokumentation.

Ark


----------



## SlaterB (24. Nov 2008)

die Fehlermeldung sagt, dass es keine Methode multiply(double) gibt,
das solltest du zügig verstehen lernen,

tja, der denkende Schritt wäre nun

BigDecimal ergebnis = new BigDecimal("1");
BigDecimal xBig = new BigDecimal(x);
ergebnis = ergebnis.multiply (xBig);

wenn man darauf nicht kommt, dann kann einem das auch niemand beibringen

es gibt speziell bei double noch die Besonderheit, 
dass new BigDecimal(double); ungeignet ist, 
besser BigDecimal.valueOf(x); wenn ich mich recht erinnere,

oder etwas aufwendiger wie hier:
http://www.3tools.de/2007-11-01/rundungsfehler-bei-bigdecimal


----------



## Guest (24. Nov 2008)

...also kann ich BigDecimal nur mit BigDecimal multiplizieren?  Oh man...

Naja, kann man dann x (=double) irgendwie in BigDecimal umwandeln? ...Ich kann nich einfach das x anders definieren, das wird vorher schon bei ner anderen Funktion als double verwendet.


----------



## mahe (24. Nov 2008)

Jup, einfach im Konstruktor übergeben.

Potenzieren geht übrigens über Math.pow(x,y). Das bräuchtest Du also nicht selber schreiben.

Ist die Funktion für irgendwas gut oder lediglich als Übung/Aufgabe?


----------

