Java tem algo para representar o infinito para cada tipo de dado numérico? Como é implementado para que eu possa fazer operações matemáticas com ele?
Por exemplo
int myInf = infinity; //However it is done
myInf + 5; //returns infinity
myInf*(-1); //returns negative infinity
Tentei usar números muito grandes, mas quero uma solução adequada e fácil .
∞-∞==0
ser verdade? E também: Por que você precisa disso?Respostas:
double
suporta Infinityimpressões
nota: não
Infinity - Infinity
é um número .fonte
float
sempre que possível, pois sua precisão é muito baixa. ;)Suponho que você esteja usando matemática inteira por um motivo. Nesse caso, você pode obter um resultado que é funcionalmente quase o mesmo que POSITIVE_INFINITY usando o campo MAX_VALUE da
Integer
classe:(E, para NEGATIVE_INFINITY, você pode usar MIN_VALUE.) É claro que haverá algumas diferenças funcionais, por exemplo, ao comparar
myInf
com um valor que é MAX_VALUE: claramente esse número não é menormyInf
.Também há uma biblioteca que realmente possui os campos POSITIVE_INFINITY e NEGATIVE_INFINITY, mas na verdade são apenas novos nomes para MAX_VALUE e MIN_VALUE.
fonte
Integer.MAX_VALUE
como infinito e nãoDouble.POSITIVE_INFINITY
o que você disse que eles são 'funcionalmente quase iguais', então qual é a diferença?Integer.MAX_VALUE
ainda é finito, é apenas um truque para imitar o infinito. Além disso,Integer.MAX_VALUE
é de apenas 32 bits, enquantoDouble.POSITIVE_INFINITY
é de 64 bits.Para usar
Infinity
, você pode usar oDouble
que suportaInfinity
: -SAÍDA : -
fonte
Os tipos
Double
eFloat
têm aPOSITIVE_INFINITY
constante.fonte
Não tenho certeza de que o Java tenha infinito para cada tipo numérico, mas para alguns tipos de dados numéricos a resposta é positiva:
ou
Além disso, você pode achar útil o seguinte artigo, que representa algumas operações matemáticas envolvendo +/- infinito: Complexidade do número de ponto flutuante do Java .
fonte
Somente os tipos Double e Float suportam
POSITIVE_INFINITY
constante.fonte
Para os tipos de wrapper numérico.
por exemplo, Double.POSITVE_INFINITY
Espero que isso possa ajudá-lo.
fonte
Uma solução genérica é introduzir um novo tipo. Pode estar mais envolvido, mas tem a vantagem de trabalhar para qualquer tipo que não defina seu próprio infinito.
Se
T
é um tipo para o quallteq
está definido, você pode definirInfiniteOr<T>
comlteq
algo como isto:Deixo para você traduzir isso para a sintaxe exata do Java. Espero que as idéias sejam claras; mas deixe-me explicá-los de qualquer maneira.
A idéia é criar um novo tipo que tenha todos os mesmos valores de algum tipo já existente, mais um valor especial que, tanto quanto você pode dizer através de métodos públicos, age exatamente da maneira que você deseja que o infinito aja, por exemplo, é maior que algo mais. estou a usar
null
para representar o infinito aqui, pois isso parece o mais direto em Java.Se você deseja adicionar operações aritméticas, decida o que elas devem fazer e implemente-as. Provavelmente é mais simples se você manipular os casos infinitos primeiro e depois reutilizar as operações existentes com valores finitos do tipo original.
Pode ou não haver um padrão geral para se é benéfico ou não adotar uma convenção de lidar com infinitos do lado esquerdo antes dos infinitos do lado direito ou vice-versa; Não sei dizer sem experimentar, mas para menos que ou igual (
lteq
), acho mais simples olhar primeiro para o infinito do lado direito. Noto que nãolteq
é comutativo, mas eadd
mul
é; talvez isso seja relevante.Nota: apresentar uma boa definição do que deve acontecer com valores infinitos nem sempre é fácil. É para comparação, adição e multiplicação, mas talvez não subtração. Além disso, há uma distinção entre números cardinais e ordinais infinitos aos quais você pode prestar atenção.
fonte
-(yourvalue)
funcione corretamente. E isso também permitiria que você apoiasse o conceito NaN (não um número). Além disso, a adição de valores especiais sobre tipos integrais pode ser uma boa ideia, principalmente quando o aplicativo precisa de semânticas que são violadas por números de ponto flutuante.Como a classe Number não é final, eis uma idéia que ainda não encontro nos outros posts. Ou seja, para subclassificar a classe Number.
De alguma forma, isso entregaria um objeto que pode ser tratado como infinito para Inteiro, Longo, Duplo, Flutuante, BigInteger e BigDecimal.
Como existem apenas dois valores, poderíamos usar o padrão singleton:
De alguma forma, acho que os métodos restantes intValue (), longValue () etc. devem ser substituídos para lançar uma exceção. Para que o valor infinito não possa ser usado sem outras precauções.
fonte
Sou iniciante em Java ... Encontrei outra implementação para o infinito na documentação Java, para os tipos
boolean
edouble
. https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.3Parece feio, mas funciona.
fonte