Czy Java ma coś, co reprezentuje nieskończoność dla każdego liczbowego typu danych? Jak to jest zaimplementowane, że mogę na nim wykonywać operacje matematyczne?
Na przykład
int myInf = infinity; //However it is done
myInf + 5; //returns infinity
myInf*(-1); //returns negative infinity
Próbowałem używać bardzo dużych liczb, ale chcę odpowiedniego, łatwego rozwiązania.
∞-∞==0
być prawdą? A także: dlaczego potrzebujesz czegoś takiego?Odpowiedzi:
double
obsługuje Infinitywydruki
Uwaga:
Infinity - Infinity
to nie liczba .źródło
float
gdy tylko jest to możliwe, ponieważ jego precyzja jest dość niska. ;)Przypuszczam, że nie bez powodu używasz matematyki całkowitej. Jeśli tak, możesz uzyskać wynik, który funkcjonalnie jest prawie taki sam jak POSITIVE_INFINITY, używając pola MAX_VALUE
Integer
klasy:(A dla NEGATIVE_INFINITY możesz użyć MIN_VALUE.) Oczywiście będą pewne różnice funkcjonalne, np. W porównaniu
myInf
z wartością, która przypadkiem wynosi MAX_VALUE: oczywiście ta liczba nie jest mniejsza niżmyInf
.Istnieje również biblioteka, która faktycznie ma pola POSITIVE_INFINITY i NEGATIVE_INFINITY, ale tak naprawdę są to tylko nowe nazwy dla MAX_VALUE i MIN_VALUE.
źródło
Integer.MAX_VALUE
jako nieskończoności, a nieDouble.POSITIVE_INFINITY
powiedziałeś, że są one „prawie takie same funkcjonalnie”, więc jaka jest różnica?Integer.MAX_VALUE
jest nadal skończona, to tylko trik do naśladowania nieskończoności. PonadtoInteger.MAX_VALUE
jest tylko 32-bitowy, podczas gdyDouble.POSITIVE_INFINITY
jest 64-bitowy.Aby użyć
Infinity
, możesz użyć,Double
które obsługujeInfinity
: -WYJŚCIE : -
źródło
Double
IFloat
typy mająPOSITIVE_INFINITY
stałą.źródło
Nie jestem pewien, czy Java ma nieskończoność dla każdego typu liczbowego, ale w przypadku niektórych liczbowych typów danych odpowiedź jest twierdząca:
lub
Przydatny może się również okazać następujący artykuł, w którym przedstawiono niektóre operacje matematyczne związane z +/- nieskończonością: Zawiłości liczb zmiennoprzecinkowych Java .
źródło
Tylko typy Double i Float obsługują
POSITIVE_INFINITY
stałą.źródło
Dla liczbowych typów opakowań.
np. Double.POSITVE_INFINITY
Mam nadzieję, że to może ci pomóc.
źródło
Ogólnym rozwiązaniem jest wprowadzenie nowego typu. Może być bardziej zaangażowany, ale ma tę zaletę, że działa dla każdego typu, który nie definiuje własnej nieskończoności.
Jeśli
T
jest to typ, dla któregolteq
jest zdefiniowana, można określićInfiniteOr<T>
zlteq
czymś takim:Tobie pozostawiam przetłumaczenie tego na dokładną składnię Java. Mam nadzieję, że pomysły są jasne; ale mimo wszystko pozwól mi je przeliterować.
Chodzi o to, aby stworzyć nowy typ, który ma wszystkie te same wartości, co jakiś już istniejący typ, plus jedną specjalną wartość, która - o ile możesz to stwierdzić za pomocą metod publicznych - działa dokładnie tak, jak chcesz, aby działała nieskończoność, np. Jest większa niż coś jeszcze. Używam
null
tutaj do reprezentowania nieskończoności, ponieważ wydaje się to najprostsze w Javie.Jeśli chcesz dodać operacje arytmetyczne, zdecyduj, co mają zrobić, a następnie zaimplementuj to. Prawdopodobnie najprościej jest, jeśli najpierw zajmiesz się nieskończonymi przypadkami, a następnie ponownie użyjesz istniejących operacji na skończonych wartościach oryginalnego typu.
Może istnieć ogólny wzorzec wskazujący, czy korzystne jest przyjęcie konwencji traktowania lewostronnych nieskończoności przed prawostronnymi lub odwrotnie; Nie mogę tego stwierdzić bez wypróbowania tego, ale w przypadku mniej niż lub równych (
lteq
) myślę, że łatwiej jest najpierw spojrzeć na nieskończoność po prawej stronie. Zauważam, że nielteq
jest to przemienne, aleadd
imul
są; może to ma znaczenie.Uwaga: wymyślenie dobrej definicji tego, co powinno się dziać z nieskończonymi wartościami, nie zawsze jest łatwe. Służy do porównywania, dodawania i mnożenia, ale może nie do odejmowania. Istnieje również rozróżnienie między nieskończonymi liczbami głównymi i porządkowymi, na które warto zwrócić uwagę.
źródło
-(yourvalue)
działa poprawnie. Pozwoliłoby to również na wspieranie koncepcji NaN (nie liczby). Poza tym dodanie specjalnych wartości do typów całkowitych może być dobrym pomysłem, szczególnie gdy aplikacja wymaga semantyki, która jest naruszana przez liczby zmiennoprzecinkowe.Ponieważ numer klasy nie jest ostateczny, oto pomysł, którego jeszcze nie znajduję w innych postach. Mianowicie, aby podklasować numer klasy.
W jakiś sposób dostarczyłoby to obiekt, który można traktować jako nieskończoność dla liczb Integer, Long, Double, Float, BigInteger i BigDecimal.
Ponieważ istnieją tylko dwie wartości, możemy użyć wzorca singleton:
W jakiś sposób uważam, że pozostałe metody intValue (), longValue () itd. Powinny zostać zastąpione, aby zgłosić wyjątki. Aby wartość nieskończoności nie mogła być używana bez dalszych środków ostrożności.
źródło
Jestem początkującym w Javie ... Znalazłem inną implementację nieskończoności w dokumentacji Java dla typów
boolean
idouble
. https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.3Wygląda brzydko, ale działa.
źródło