parsedouble - java double example
¿Cómo implementar infinito en Java? (8)
¿Tiene Java algo para representar el infinito para cada tipo de datos numéricos? ¿Cómo se implementa de modo que pueda hacer operaciones matemáticas con él?
P.ej
int myInf = infinity; //However it is done
myInf + 5; //returns infinity
myInf*(-1); //returns negative infinity
He intentado usar números muy grandes, pero quiero una solución adecuada y fácil .
Los tipos Double
y Float
tienen la constante POSITIVE_INFINITY
.
No estoy seguro de que Java tenga infinito para cada tipo numérico, pero para algunos tipos de datos numéricos la respuesta es positiva:
Float.POSITIVE_INFINITY
Float.NEGATIVE_INFINITY
o
Double.POSITIVE_INFINITY
Double.NEGATIVE_INFINITY
También puede encontrar útil el siguiente artículo que representa algunas operaciones matemáticas que implican +/- infinito: intrínsecas de números flotantes de Java .
Para los tipos de envoltura numérica.
por ejemplo, Double.POSITVE_INFINITY
Espero que esto te pueda ayudar.
Para usar Infinity
, puede usar Double
que admite Infinity
: -
System.out.println(Double.POSITIVE_INFINITY);
System.out.println(Double.POSITIVE_INFINITY * -1);
System.out.println(Double.NEGATIVE_INFINITY);
System.out.println(Double.POSITIVE_INFINITY - Double.NEGATIVE_INFINITY);
System.out.println(Double.POSITIVE_INFINITY - Double.POSITIVE_INFINITY);
SALIDA : -
Infinity
-Infinity
-Infinity
Infinity
NaN
Solo el tipo Doble y Float admiten la constante POSITIVE_INFINITY
.
Supongo que estás usando matemáticas enteras por algún motivo. Si es así, puedes obtener un resultado que sea funcionalmente similar a POSITIVE_INFINITY utilizando el campo MAX_VALUE de la clase Integer
:
Integer myInf = Integer.MAX_VALUE;
(Y para NEGATIVE_INFINITY puede usar MIN_VALUE.) Por supuesto que habrá algunas diferencias funcionales, por ejemplo, al comparar myInf
con un valor que es MAX_VALUE: claramente este número no es menor que myInf
.
También hay una biblioteca que en realidad tiene los campos POSITIVE_INFINITY y NEGATIVE_INFINITY, pero en realidad son solo nuevos nombres para MAX_VALUE y MIN_VALUE.
Una solución genérica es introducir un nuevo tipo. Puede ser más complicado, pero tiene la ventaja de funcionar para cualquier tipo que no defina su propio infinito.
Si T
es un tipo para el que se define lteq
, puede definir InfiniteOr<T>
con lteq
algo como esto:
class InfiniteOr with type parameter T:
field the_T of type null-or-an-actual-T
isInfinite()
return this.the_T == null
getFinite():
assert(!isInfinite());
return this.the_T
lteq(that)
if that.isInfinite()
return true
if this.isInfinite()
return false
return this.getFinite().lteq(that.getFinite())
Te dejo traducir esto a la sintaxis exacta de Java. Espero que las ideas sean claras; pero déjame deletrearlos de todos modos.
La idea es crear un nuevo tipo que tenga todos los mismos valores que un tipo ya existente, más un valor especial que, en la medida en que usted pueda decirlo a través de métodos públicos, actúe exactamente de la manera que desea que actúe el infinito, por ejemplo, es mayor que Algo más. Estoy usando null
para representar infinito aquí, ya que parece ser el más sencillo en Java.
Si desea agregar operaciones aritméticas, decida qué deben hacer, luego impleméntelas. Probablemente sea más simple si maneja los casos infinitos primero, luego reutilice las operaciones existentes en valores finitos del tipo original.
Puede haber, o no, un patrón general sobre si es o no beneficioso adoptar una convención para manejar infinitos del lado izquierdo antes que infinitos del lado derecho o viceversa; No puedo decirlo sin probarlo, pero para menos que igual ( lteq
), creo que es más simple mirar primero el lado derecho del infinito. Observo que lteq
no es conmutativo, pero add
y mul
son; tal vez eso es relevante.
Nota: obtener una buena definición de lo que debería suceder en valores infinitos no siempre es fácil. Es para la comparación, la suma y la multiplicación, pero tal vez no la resta. Además, hay una distinción entre infinitos números cardinales y ordinales a los que le conviene prestarle atención.
soportes double
Infinity
double inf = Double.POSITIVE_INFINITY;
System.out.println(inf + 5);
System.out.println(inf - inf); // same as Double.NaN
System.out.println(inf * -1); // same as Double.NEGATIVE_INFINITY
huellas dactilares
Infinity
NaN
-Infinity
nota: Infinity - Infinity
no es un número .