¿Java tiene algo que represente el infinito para cada tipo de datos numéricos? ¿Cómo se implementa de modo que pueda realizar 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 .
∞-∞==0
ser verdad? Y también: ¿Por qué necesitas tal cosa?Respuestas:
double
soporta Infinityhuellas dactilares
nota: no
Infinity - Infinity
es un número .fuente
float
siempre que sea posible ya que su precisión es bastante pobre. ;)Supongo que estás usando matemáticas enteras por una razón. Si es así, puede obtener un resultado funcionalmente similar al POSITIVE_INFINITY utilizando el campo MAX_VALUE de la
Integer
clase:(Y para NEGATIVE_INFINITY, podría usar MIN_VALUE.) Por supuesto, habrá algunas diferencias funcionales, por ejemplo, cuando se compara
myInf
con un valor que resulta ser MAX_VALUE: claramente este número no es menor quemyInf
.También hay una biblioteca que en realidad tiene campos POSITIVE_INFINITY y NEGATIVE_INFINITY, pero en realidad son nombres nuevos para MAX_VALUE y MIN_VALUE.
fuente
Integer.MAX_VALUE
como infinito en lugar deDouble.POSITIVE_INFINITY
decir que son 'funcionalmente casi iguales', entonces cuál es la diferencia?Integer.MAX_VALUE
todavía es finito, es solo un truco para imitar el infinito. Además,Integer.MAX_VALUE
solo tiene 32 bits, mientras queDouble.POSITIVE_INFINITY
es de 64 bits.Para usar
Infinity
, puede usarDouble
qué soportesInfinity
: -SALIDA : -
fuente
Los tipos
Double
yFloat
tienen laPOSITIVE_INFINITY
constante.fuente
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:
o
También puede resultarle útil el siguiente artículo, que representa algunas operaciones matemáticas que involucran +/- infinito: complejidades de números de punto flotante de Java .
fuente
Solo el tipo Double y Float admite
POSITIVE_INFINITY
constante.fuente
Para los tipos de envoltorio numérico.
por ejemplo, Double.POSITVE_INFINITY
Espero que esto te pueda ayudar.
fuente
Una solución genérica es introducir un nuevo tipo. Puede estar más involucrado, pero tiene la ventaja de trabajar para cualquier tipo que no defina su propio infinito.
Si
T
es un tipo para el quelteq
está definido, puede definirloInfiniteOr<T>
conlteq
algo como esto:Dejaré que traduzca 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 algunos tipos ya existentes, más un valor especial que, por lo que puede ver a través de métodos públicos, actúa exactamente de la manera en que desea que actúe el infinito, por ejemplo, es mayor que Algo más. Estoy usando
null
para representar el infinito aquí, ya que eso parece lo más sencillo en Java.Si desea agregar operaciones aritméticas, decida qué deben hacer, luego implemente eso. Probablemente sea más simple si maneja los casos infinitos primero y luego reutiliza las operaciones existentes en valores finitos del tipo original.
Puede haber o no un patrón general para determinar si es beneficioso o no adoptar una convención para manejar los infinitos del lado izquierdo antes que los infinitos del lado derecho o viceversa; No puedo decirlo sin probarlo, pero para menos que o igual (
lteq
) creo que es más simple mirar primero el infinito del lado derecho. Tomo nota de quelteq
es no conmutativo, peroadd
ymul
son; Quizás eso sea relevante.Nota: proponer una buena definición de lo que debería suceder en valores infinitos no siempre es fácil. Es para comparación, suma y multiplicación, pero tal vez no para resta. Además, hay una distinción entre los números cardinales y ordinales infinitos a los que puede prestar atención.
fuente
-(yourvalue)
funcione correctamente. Y eso también le permitiría apoyar el concepto NaN (no un número). Aparte de eso, agregar valores especiales sobre los tipos integrales puede ser una buena idea, particularmente cuando la aplicación necesita semánticas que son violadas por números de punto flotante.Como el número de clase no es definitivo, aquí hay una idea que aún no encuentro en las otras publicaciones. A saber, subclasificar el número de clase.
Esto de alguna manera entregaría un objeto que puede ser tratado como infinito para Integer, Long, Double, Float, BigInteger y BigDecimal.
Como solo hay dos valores, podríamos usar el patrón singleton:
De alguna manera, creo que los métodos restantes intValue (), longValue () etc. deberían ser anulados para arrojar excepciones. Para que el valor de infinito no se pueda usar sin más precauciones.
fuente
Soy un principiante en Java ... Encontré otra implementación para el infinito en la documentación de Java, para los tipos
boolean
ydouble
. https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.3Se ve feo, pero funciona.
fuente