Discussion:
BigDecimal - pierwiastek
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
jekon
2005-11-26 14:08:13 UTC
Permalink
Witam,
jak wyciągnąć pierwiastek z BigInteger i BigDecimal, pow() nie
zadziała, ponieważ parametr pow() musi byc int ??
W dokumentacji nie za bardzo mogę znaleźć.
J.
--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
Twelve Hungry Mammoths
2005-11-26 14:21:03 UTC
Permalink
Post by jekon
jak wyciągnąć pierwiastek z BigInteger i BigDecimal, pow() nie
zadziała, ponieważ parametr pow() musi byc int ??
W dokumentacji nie za bardzo mogę znaleźć.
jezeli nie zalezy Ci na absolutnej precyzji, to mozna obejsc problem,
konwertujac na double:

BigDecimal bd = new BigDecimal (8);
double p = Math.pow (bd.doubleValue (), 1/3);
bd = new BigDecimal (p);

pzdr
szeryf
j***@op.pl
2005-11-26 14:37:25 UTC
Permalink
Post by Twelve Hungry Mammoths
jezeli nie zalezy Ci na absolutnej precyzji, to mozna obejsc problem,
Wiem w klasie Math są wszystkie pierwiastki.
Mnie jednak zależy na BigDecimal
J
--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
Twelve Hungry Mammoths
2005-11-26 14:32:16 UTC
Permalink
On Sat, 26 Nov 2005 15:21:03 +0100, Twelve Hungry Mammoths
<***@microsoft.com> wrote:

autopoprawka:

BigDecimal bd = new BigDecimal (8);
double p = Math.pow (bd.doubleValue (), 1/3.0);
bd = new BigDecimal (p);

pzdr
szeryf

PS. nie bede wysylal niesprawdzonego kodu. nie bede wysylal
niesprawdzonego kodu. nie bede wysylal niesprawdzonego kodu. nie bede
wysylal niesprawdzonego kodu. nie bede wysylal niesprawdzonego kodu. nie
bede wysylal niesprawdzonego kodu... (-:
jekon
2005-11-26 15:02:32 UTC
Permalink
Post by Twelve Hungry Mammoths
BigDecimal bd = new BigDecimal (8);
double p = Math.pow (bd.doubleValue (), 1/3.0);
bd = new BigDecimal (p);
Ja jednak mam na myśli liczbę BigDecimal, która
składa sie np. z 40 cyfr.
I ten kod nie przejdzie.
J
--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
Adam Kiezun
2005-11-26 18:41:30 UTC
Permalink
Post by jekon
Post by Twelve Hungry Mammoths
BigDecimal bd = new BigDecimal (8);
double p = Math.pow (bd.doubleValue (), 1/3.0);
bd = new BigDecimal (p);
Ja jednak mam na myśli liczbę BigDecimal, która
składa sie np. z 40 cyfr.
I ten kod nie przejdzie.
to moze np http://www.merriampark.com/bigsqrt.htm
(disclaimer: nie sprawdzalem czy dziala)

jest o tym sporo na Twojej Ulubionej Wyszukiwarce.

/adam
Laine
2005-11-27 11:17:36 UTC
Permalink
Post by jekon
Witam,
jak wyciągnąć pierwiastek z BigInteger i BigDecimal, pow() nie
zadziała, ponieważ parametr pow() musi byc int ??
W dokumentacji nie za bardzo mogę znaleźć.
Np tak:

private static final BigInteger CONST_0 = new BigInteger("0");
private static final BigInteger CONST_2 = new BigInteger("2");

private BigInteger sqrt(BigInteger m) {

int diff=m.compareTo(CONST_0);
if (diff<0) {
throw new IllegalArgumentException("Cannot compute square root of a
negative integer!");
}
if (diff==0) {
return BigInteger.valueOf(0);
}
BigDecimal two=new BigDecimal(CONST_2);
BigDecimal n=new BigDecimal(m);
byte[] barray=new byte[m.bitLength()/16+1];
barray[0]=(byte)255;
BigDecimal r=new BigDecimal(new BigInteger(1,barray));
r =
r.subtract(r.multiply(r).subtract(n).divide(r.multiply(two),BigDecimal.ROUND_UP));
while (r.multiply(r).compareTo(n)>0) {
r =
r.subtract(r.multiply(r).subtract(n).divide(r.multiply(two),BigDecimal.ROUND_UP));
}
return r.toBigInteger();
}


Pozdrawiam
Krupa

Loading...