1.0000000000000007E39 es 1.0000000000000007*10^39
Cuando los números son muy grandes (o muy pequeños) se representan con notación científica.
Por otro lado, double tiene una precisión determinada, no puedes representar cualquier número con un double (ni decimal ni entero), cuando eso ocurre lo sustituye un valor cercano.
Cuando se quiere trabajar con números muy grandes o con gran precisión, como dinero o cálculos científicos, se usa BigDecimal y BigInteger, auqnue estos tampoco son perfectos.
http://www.javamex.com/tutorials/mat...gInteger.shtml
No he leído tu código, así que quizás tengas también errores en tu algoritmo.