bigdecimal.pow(0.5)

Status
Nicht offen für weitere Antworten.

Tobias

Top Contributor
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

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

@ tobias, richtig, double reicht leider nicht
 

The_S

Top Contributor
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

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

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

wenn n < 0
 

The_S

Top Contributor
OK, hast eigentlich recht.

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

0xdeadbeef

Top Contributor
Code:
    /**
     * 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):
Code:
    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

Top Contributor
@ 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

Top Contributor
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

Top Contributor
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

Top Contributor
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) {
^
symbol : method log(java.math.BigDecimal,int)
return exp(bigdecimal1.multiply(log(bigdecimal, j + 10)), j + 10).setScale(scale, roundingMode);
^
2 errors
 

The_S

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

P.S. you got mail ;)
 

The_S

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

Trotzdem danke!
 

0xdeadbeef

Top Contributor
Äh, sorry, ich dachte, Du meinst den Integeralgorithmus, denn für BigDecimals (scale >0) gibt die obige Funktion ja
Code:
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

Top Contributor
0xdeadbeef hat gesagt.:
Äh, sorry, ich dachte, Du meinst den Integeralgorithmus, denn für BigDecimals (scale >0) gibt die obige Funktion ja
Code:
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))

Aaaaaaaaaahhhhhhhh *licht-auf-geh*. OMG, is ja echt peinlich dass ich da net selber draufgekommen bin :oops: . Nochma thx!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Robertop BigDecimal ergänzt unnötige 0 am Ende Allgemeine Java-Themen 6
M Probleme mit BigDecimal Allgemeine Java-Themen 1
ARadauer Checksumme über BigDecimal Werte Allgemeine Java-Themen 11
M float, double, BigDecimal Allgemeine Java-Themen 5
A Ungünstige BigDecimal-Klasse Allgemeine Java-Themen 44
ARadauer BigDecimal und Not a Number Allgemeine Java-Themen 4
R BigDecimal, Position des Kommas Allgemeine Java-Themen 2
J Umstellung von double auf BigDecimal Allgemeine Java-Themen 5
F BigDecimal devide Allgemeine Java-Themen 5
S wiedermal ein kleines Problem mit BigDecimal Allgemeine Java-Themen 5
B BigDecimal Schleifen Allgemeine Java-Themen 9
J BigInteger und BigDecimal im Eclipse-Debugger Allgemeine Java-Themen 3
hdi Probleme beim Rechnen mit BigDecimal Allgemeine Java-Themen 5
N BigDecimal falsch formatiert bei Locale.GERMANY Allgemeine Java-Themen 3
S String to BigDecimal Allgemeine Java-Themen 6
N BigDecimal.divide Problem Allgemeine Java-Themen 6
N setscale bigdecimal Allgemeine Java-Themen 3
M String to BigDecimal Allgemeine Java-Themen 7
N BigDecimal formatieren Allgemeine Java-Themen 2
André Uhres BigDecimal in HashSet eingefügt, aber nicht in TreeSet Allgemeine Java-Themen 2
G BigDecimal Rundet falsche Allgemeine Java-Themen 4
0 Keine clone-Methode für BigDecimal und BigInteger? Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben