# bigdecimal.pow(0.5)



## The_S (6. Dez 2005)

Hi, 

wie kann ich einen BigDecimal "hoch eine Kommazahl" setzen?

Thx.


----------



## meez (6. Dez 2005)

Nimm dies http://www.jonelo.de/java/bigal/index.html


----------



## Tobias (6. Dez 2005)

Auf die Schnelle fällt mir nur Math.pow(BigDecimal.doubleValue(), 0.5) ein - aber wenn du mit dem Wertebereich klar kämst, würdest du wohl gleich double nutzen, wie?

mpG
Tobias


----------



## The_S (6. Dez 2005)

@ meez, scheint gut zu sein. Da das mit BigDecimal arbeitet werd ich mir mal den Code dazu anschauen.

@ tobias, richtig, double reicht leider nicht


----------



## Bleiglanz (6. Dez 2005)

speziell für die Quadratwurzel gibts doch auch eine schnelle Iteration

http://de.wikipedia.org/wiki/Heronverfahren


----------



## The_S (6. Dez 2005)

Is aber net nur für Quadratwurzeln, sondern jede n-te Wurzel . Trotzdem thx.


----------



## Bleiglanz (6. Dez 2005)

auch für die gehts mit einer einfachen Iteration

http://de.wikipedia.org/wiki/Wurzel_(Mathematik)

(Newtonverfahren)


----------



## The_S (6. Dez 2005)

Hey, danke. Werd mir das mal anschauen.

Nochwas zu pow

Warum kann pow keine negativen Zahlen behandeln? Das sollte doch eigentlich möglich sein!?


----------



## Bleiglanz (6. Dez 2005)

da ist die api wohl zu spartanisch, kannst du ja leicht auflösen

x^n = 1 / (x^(-n)) 

wenn n < 0


----------



## The_S (6. Dez 2005)

OK, hast eigentlich recht.

Nur eigentlich hatte ich erwartet, dass sowas unterstützt wird. Aber da kannst wohl nix machen .


----------



## 0xdeadbeef (6. Dez 2005)

```
/**
     * Calculate X to the power of Y: x^y
     * @param bigdecimal Base (x)
     * @param bigdecimal1 Exponent (y)
     * @param scale
     * @return X to the power of Y: x^y
     */
    static BigDecimal pow(BigDecimal bigdecimal, BigDecimal bigdecimal1, int scale) {
        int j = scale + 5;
        if(bigdecimal1.setScale(0, roundingMode).compareTo(bigdecimal1) == 0) {
            boolean flag = bigdecimal1.signum() == -1;
            BigInteger biginteger = bigdecimal1.abs().toBigInteger();
            BigDecimal bigdecimal2 = ONE;
            for(int k = biginteger.bitLength(); k > 0; k--) {
                if(biginteger.testBit(k))
                    bigdecimal2 = bigdecimal2.multiply(bigdecimal).setScale(j, roundingMode);
                bigdecimal2 = bigdecimal2.multiply(bigdecimal2).setScale(j, roundingMode);
                if(interrupt)
                    break;
            }
            if(biginteger.testBit(0))
                bigdecimal2 = bigdecimal2.multiply(bigdecimal).setScale(j, roundingMode);
            if(flag)
                bigdecimal2 = ONE.divide(bigdecimal2, j, roundingMode);
            return bigdecimal2.setScale(scale, roundingMode);
        }
        if(bigdecimal1.compareTo(ZERO) == 0)
            return ONE;
        if(bigdecimal1.compareTo(ONE) == 0)
            return bigdecimal;
        if(bigdecimal1.compareTo(ONE.negate()) == 0)
            return ONE.divide(bigdecimal, scale, roundingMode);
        if(bigdecimal1.compareTo(TWO) == 0)
            return bigdecimal.multiply(bigdecimal).setScale(scale, roundingMode);
        if(bigdecimal1.compareTo(ONE) == 0)
            return bigdecimal;
        return exp(bigdecimal1.multiply(log(bigdecimal, j + 10)), j + 10).setScale(scale, roundingMode);
    }
```

Damit mans kompilieren kann, braucht's noch ein paar final statics usw. (nicht alle, bin aber gerade faul):

```
final static BigDecimal ONE = BigDecimal.valueOf(1);
    final static BigDecimal TWO = BigDecimal.valueOf(2);    
    final static BigDecimal HALF = new BigDecimal("0.5");
    final static BigDecimal THREE = BigDecimal.valueOf(3);
    final static BigDecimal FOUR = BigDecimal.valueOf(4);
    final static BigDecimal FIVE = BigDecimal.valueOf(5);
    final static BigDecimal EIGHT = BigDecimal.valueOf(8);
    final static BigDecimal NINE = BigDecimal.valueOf(9);
    final static BigDecimal TWELFE = BigDecimal.valueOf(12);
    final static BigDecimal SIXTEEN = BigDecimal.valueOf(16);
    final static BigDecimal ZERO = BigDecimal.valueOf(0);
    static BigDecimal PI_    = new BigDecimal("3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724587006606315588174881520920962829254091715364367892590360011330530548820466521384146951941511609433057270365759591953092186117381932611793105118548074462379962749567351885752724891227938183011949129833673362440656643");
    static BigDecimal E_     = new BigDecimal("2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178525166427427466391932003059921817413596629043572900334295260595630738132328");
    static BigDecimal log2_  = new BigDecimal("0.6931471805599453094172321214581765680755001343602552541206800094933936219696947156058633269964186875");
    static BigDecimal log10_ = new BigDecimal("2.3025850929940456840179914546843642076011014886287729760333279009675726096773524802359972050895982983");
    
    /**
     * Rounding mode applied in here
     */
    public static int roundingMode = BigDecimal.ROUND_HALF_EVEN;
```


----------



## The_S (7. Dez 2005)

@ 0xdeadbeef

kannst du mir deinen Algorithmus erklären? Ich setze nur ungern Code ein, den ich nicht vollständig verstanden haben (kann aber auch an der morgendlichen Stunde liegen )

@ meez

BigAl kann kein ^-n geschweige denn ^. ! Bin nicht so von dem Prog überezug :roll:


----------



## meez (7. Dez 2005)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> @ meez
> 
> BigAl kann kein ^-n geschweige denn ^. ! Bin nicht so von dem Prog überezug :roll:



Du musst halt ein wenig umformen...Das Prog ist  kein "einfacher" Rechner sondern ein Prog, dass dir die Basismechanismen zur Berechnung von wirklich grosssen Zahlen bietet..

btw. Für was brauchst du den überhaupt ^-n


----------



## The_S (7. Dez 2005)

Soweit wie ich gesehen hab, nutzt das einfach die Standardfunktionen + einige Algorithmen. Für mein Ziel kann man da nicht viel umformen (außer ich bin blind :shock: ).

Ich brauche ^-n um extrem kleine Zahlen verkürzt darzustellen. z. B. x*10^-n.

Und wehe wenn mir jetzt einer sagt "dann verwende halt scaleByPowerOfTen". Ich brauche das auch für jede andere Zahl, außerdem isses auch benutzerfreundlicher, ohne dass ich noch was zusätzlich in meinen Code einbauen müsste


----------



## The_S (7. Dez 2005)

Wollte jetzt dazu übergehen die Klasse evtl. durch ausprobieren zu verstehen. Kommt aber zu zwei compilier problemen.

1. Er findet die Variable interrupted nicht
2. log findet er auch net



> --------------------Configuration: <Default>--------------------
> symbol  : variable interrupt
> if(interrupt) {
> ^
> ...


----------



## 0xdeadbeef (8. Dez 2005)

Hi,

der Algorithmus wird - soweit ich das jetzt auf die schnelle gefunden
habe - hier ganz gut erklärt:
http://matheplanet.com/default3.html?call=article.php?sid=619

Ansonsten kann ich Dir die ganze Klasse schicken, wenn Du mir Deine eMail-Adresse als PN schickst.


----------



## The_S (8. Dez 2005)

Danke für den Link, grob überflogen Top :toll: ! Den Rest schau ich mir morgen an.

P.S. you got mail


----------



## The_S (9. Dez 2005)

Super link, nur geht der leider nicht darauf ein wie man mit Fließkommazahlen potenziert  .

Trotzdem danke!


----------



## 0xdeadbeef (9. Dez 2005)

Äh, sorry, ich dachte, Du meinst den Integeralgorithmus, denn für BigDecimals (scale >0) gibt die obige Funktion ja

```
exp(bigdecimal1.multiply(log(bigdecimal, j + 10)), j + 10).setScale(scale, roundingMode)
```
zurück:
Und das ist die ganz schlichte und altbekannte Umformung:

x^y = exp(y*ln(x))


----------



## The_S (10. Dez 2005)

0xdeadbeef hat gesagt.:
			
		

> Äh, sorry, ich dachte, Du meinst den Integeralgorithmus, denn für BigDecimals (scale >0) gibt die obige Funktion ja
> 
> ```
> exp(bigdecimal1.multiply(log(bigdecimal, j + 10)), j + 10).setScale(scale, roundingMode)
> ...



Aaaaaaaaaahhhhhhhh *licht-auf-geh*. OMG, is ja echt peinlich dass ich da net selber draufgekommen bin  . Nochma thx!


----------

