## Monday, June 20, 2011

### The Easy Way

```double x=Math.pow(2,0.5);
System.out.println(x);
```

### Newton's Method

```class NewtonRootTwo
{
public static void main(String[] args) throws Exception
{
double guess=1;

for (int i=0;i<100;i++)  // maximum 100 passes, more than enough
{
System.out.println("guess["+i+"]="+guess);
double nextGuess = (guess+2/guess)/2;
if (nextGuess==guess) break;  // cannot improve precision further
guess = nextGuess;
}
}
}
```

### Result

```java NewtonRootTwo
guess[0]=1.0
guess[1]=1.5
guess[2]=1.4166666666666665
guess[3]=1.4142156862745097
guess[4]=1.4142135623746899
guess[5]=1.414213562373095
```

### Higher Precision

Since the double data type provides very limited precision, we must use the BigDecimal class to get higher precision.
```import java.math.BigDecimal;

class HighPrecisionRootTwo
{
public static void main(String[] args) throws Exception
{
int precision=60;    // 60 decimal places

BigDecimal guess=new BigDecimal("1.0");
BigDecimal TWO = new BigDecimal("2.0");

for (int i=0;i<100;i++)  // maximum 100 passes, adjust if necessary
{
System.out.println("guess["+i+"]="+guess);
// nextGuess = ( guess + 2/guess ) / 2
TWO.divide(guess,precision,BigDecimal.ROUND_DOWN)).
divide(TWO,precision,BigDecimal.ROUND_DOWN);

if (nextGuess.compareTo(guess)==0) break;
guess = nextGuess;
}
}
}
```
```java HighPrecisionRootTwo
guess[0]=1.0
guess[1]=1.500000000000000000000000000000000000000000000000000000000000
guess[2]=1.416666666666666666666666666666666666666666666666666666666666
guess[3]=1.414215686274509803921568627450980392156862745098039215686274
guess[4]=1.414213562374689910626295578890134910116559622115744044584905
guess[5]=1.414213562373095048801689623502530243614981925776197428498289
guess[6]=1.414213562373095048801688724209698078569671875377234001561013
guess[7]=1.414213562373095048801688724209698078569671875376948073176679
```

### Computing Root Two to Million of Digits

The built in BigDecimal is just not fast enough. You will need to implement a faster BigDecimal class. "apfloat for java" may be a good choice.