El problema es el siguiente para representar en java un número en java muy grande el numero se representa de la siguiente forma "2.305843009213694E18" o sea el número elevado a algo
Hay forma de representar el número tal cual??
Yo e encontrado lo siguiente:
import java.util.*;
import java.text.*;
import java.io.*;
public class prueba
{
public static void main(String args[])
{
DecimalFormat decimal = new DecimalFormat("");
double op = (Math.pow(2,61))-1;
System.out.println(op);
System.out.println(decimal.format(op));
}
}
"DecimalFormat decimal = new DecimalFormat("")"
Pero el número que sale por pantalla es el siguiente:
2.305843009213694E18
2.305.843.009.213.694.000
O sea el número 2.305.843.009.213.694.000 cuando realmente 2^61 es 2305843009213693951, por que se pierde tanta precisión?
hola amigo!!! creo que tu solucion es usar el tipo de dato BigDecimal de la libreria Math
yo he probado con tu código y la transformación y pues listo me a funcionado.
Espero haber podido ayudar !!!! saludos.
public class Prueva {
public static void main(String[] args)
{
double op = (Math.pow(2,61));
BigDecimal opp= new BigDecimal(op);
System.out.println(opp);
}
}
listo probado en mi calculadora y en mi pc !!!
Anexo un ultimo datito BigDecimal de ta precicion!!!
::) ::) ::) ::) ::) ::) ::) ::) ::) ::) ::) ::) ::) ::) ::)
Perfecto!!!
Mi ultima duda es posible ahora almacenar esa variable opp en un double o en un long?
Porque a la hora de usarla en condicionales un BigDecimal no lo puedo usar ya que da un error "incomparable types: java.math.BigDecimal and int".
Todo esto sin perder precisión.
Puedes ser un poco mas especifico con lo que se quiere condicionar ?
ejemplo si queremos condicionar
double respuesta=math.pow(2,61);
if (respuesta ==2.305843009213694E18)
/// sentencias si es cierto
else
// sentencias si es falso
condicionalo asi q es igual !!!
solo sinecesitas mostrar resultados as la tranformacion a BigDecimal.
ejemplo
BigDecimal respuesta_de_bigdecimal= new BigDecimal(respuesta);
System.out.print(respuesta_de_bigdecimal);
pero si tienes q hacer bajo codigo he operaciones algebraicas y condiciones mi recomendacion es q lo trates con double y conviertas al final lo q es salida !!!
he intentado convertir el valor pero me devuelve valores con letras !!! asiq ps noc si estoy aclarando la duda pero hay vamos cualquiera cosa comentemos y listo !!!
Saludos.... ::) ::) ::) ::) ::) ::) ::) ::) ::) ::) ::) ::) ::) ::)
esta noche te he enseño todo el código y el problema en concreto
import java.util.*;
import java.io.*;
import java.math.*;
/**
* Calculo de la secuencia de Mersenne [(2^n)-1] y comprobación de si el número
* es primo o no.
* Salida por pantalla y guardada en .txt indicando si el numero obtenido es primo y la secuencia de Mersenne
*/
public class Mersenne
{
public static void primosMersenne(double n)
{
Calendar tiempo = Calendar.getInstance();
File f = new File("/Users/Miki/Desktop/Datos.txt");
try
{
PrintWriter pw = new PrintWriter(new FileOutputStream(f,true));
pw.println("Calculo de la secuencia de Mersenne y de sus números primos");
pw.println("-----------------------------------------------------------");
for(int i = 2; i <= n; i++)
{
double op = (Math.pow(2,i)-1);
BigDecimal uno = new BigDecimal(op);
BigDecimal dos = new BigDecimal(1);
BigDecimal res = uno.subtract(dos);
System.out.println(res);
pw.println(res);
boolean primo = true;
if(op == 2)
{
primo = true;
}
else
{
if(op%2 == 0)
{
primo = false;
}
else
{
int x = 3;
int raiz =(int)Math.sqrt(op);
while(x <= raiz && op%x != 0)
{
x += 2;
}
if(x > raiz)
{
primo = true;
}
else
{
primo = false;
}
}
}
if(primo == true)
{
System.out.println(i+"==> El número "+res+" es primo de la secuencia de Mersenne "+tiempo.get(Calendar.HOUR)+":"+tiempo.get(Calendar.MINUTE)+":"+tiempo.get(Calendar.SECOND)+":"+tiempo.get(Calendar.MILLISECOND));
pw.println(i+"==> El número "+res+" es primo de la secuencia de Mersenne "+tiempo.get(Calendar.HOUR)+":"+tiempo.get(Calendar.MINUTE)+":"+tiempo.get(Calendar.SECOND)+":"+tiempo.get(Calendar.MILLISECOND));
}
}
pw.close();
}
catch(FileNotFoundException e)
{
System.err.println("Problemas al abrir el fichero. "+e);
}
}
}
Como veras cuando calculo si el numero es primo o no utilizo condicionales "if(op == 2)", y si utilizo op en vez de opp(BigDecimal) el numero no es realmente el número que toca y el programa falla.
Es decir el numero 2^61 en double seria: 2.305843009213694E18 lo que realmente es 2305843009213693951 el cual es un número primo pero si entra como double no interpreta el número que realmente es y no lo toma como primo.
Por eso cuando se hace "if(op == 2)" necesito que op sea 2305843009213693951 y no 2.305843009213694E18.
Un poco lio no jajajjaa, esto no corre prisa ni es para nada es todo autodidacta y para aprender, si puedes o crees que se puede mejorar el código me encantaria discutirlo.
Gracias
He provado usando el op como double y no importa si estoy trabajando con 2.305843009213694E18 igual me debuelve que su residuo es 0 !!!
solo una observacion que en el for se manifiesta un i=2 incializado.
si vemos el op= math.pow(2,i); eso seria minimo 4 entonces no comprendo el
if(op==2)
jejeje no se si me doy ha entender o estoy comprendiendo mal la secuencia de mersenne.