Apakah Java memiliki sesuatu yang merepresentasikan tak terhingga untuk setiap tipe data numerik? Bagaimana ini diterapkan sehingga saya dapat melakukan operasi matematika dengannya?
Misalnya
int myInf = infinity; //However it is done
myInf + 5; //returns infinity
myInf*(-1); //returns negative infinity
Saya telah mencoba menggunakan jumlah yang sangat besar, tetapi saya menginginkan solusi yang tepat dan mudah .
∞-∞==0
benar? Dan juga: Mengapa Anda membutuhkan hal seperti itu?Jawaban:
double
mendukung Infinitydouble 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
cetakan
Catatan:
Infinity - Infinity
adalah Bukan Nomor .sumber
float
bila memungkinkan karena presisi sangat buruk. ;)Saya kira Anda menggunakan matematika integer karena suatu alasan. Jika demikian, Anda bisa mendapatkan hasil yang secara fungsional hampir sama dengan POSITIVE_INFINITY dengan menggunakan bidang MAX_VALUE
Integer
kelas:(Dan untuk NEGATIVE_INFINITY Anda dapat menggunakan MIN_VALUE.) Tentu saja akan ada beberapa perbedaan fungsi, misalnya, saat membandingkan
myInf
dengan nilai yang kebetulan MAX_VALUE: jelas angka ini tidak kurang darimyInf
.Ada juga pustaka yang sebenarnya memiliki bidang POSITIVE_INFINITY dan NEGATIVE_INFINITY, tetapi itu hanyalah nama baru untuk MAX_VALUE dan MIN_VALUE.
sumber
Integer.MAX_VALUE
sebagai infinity daripadaDouble.POSITIVE_INFINITY
Anda mengatakan bahwa mereka 'secara fungsional hampir sama', jadi apa bedanya?Integer.MAX_VALUE
masih terbatas, ini hanya peretasan untuk meniru ketidakterbatasan. SelanjutnyaInteger.MAX_VALUE
hanya 32-bit sedangkanDouble.POSITIVE_INFINITY
64-bit.Untuk menggunakan
Infinity
, Anda dapat menggunakanDouble
yang mendukungInfinity
: -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);
OUTPUT : -
sumber
Jenis
Double
danFloat
memilikiPOSITIVE_INFINITY
konstanta.sumber
Saya tidak yakin bahwa Java memiliki tak terhingga untuk setiap tipe numerik tetapi untuk beberapa tipe data numerik jawabannya positif:
atau
Juga Anda mungkin menemukan berguna artikel berikut yang mewakili beberapa operasi matematika yang melibatkan +/- infinity: Java Floating-Point Number Intricacies .
sumber
Hanya
POSITIVE_INFINITY
konstanta pendukung tipe Double dan Float .sumber
Untuk jenis pembungkus numerik.
misalnya Double.POSITVE_INFINITY
Semoga ini bisa membantu Anda.
sumber
Solusi umum adalah dengan memperkenalkan tipe baru. Ini mungkin lebih terlibat, tetapi memiliki keuntungan bekerja untuk semua jenis yang tidak menentukan ketidakterbatasannya sendiri.
Jika
T
adalah tipe yanglteq
didefinisikan, Anda dapat mendefinisikanInfiniteOr<T>
denganlteq
sesuatu seperti ini: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())
Saya akan menyerahkannya kepada Anda untuk menerjemahkan ini ke sintaks Java yang tepat. Saya berharap idenya jelas; tapi biarkan aku mengejanya.
Idenya adalah untuk membuat tipe baru yang memiliki semua nilai yang sama dengan beberapa tipe yang sudah ada, ditambah satu nilai khusus yang — sejauh yang dapat Anda katakan melalui metode publik — bertindak persis seperti yang Anda inginkan untuk bertindak tanpa batas, misalnya lebih besar dari ada yang lain. Saya menggunakan
null
untuk merepresentasikan infinity di sini, karena itu tampaknya yang paling mudah di Java.Jika Anda ingin menambahkan operasi aritmatika, putuskan apa yang harus dilakukan, lalu terapkan. Ini mungkin paling sederhana jika Anda menangani kasus tak hingga terlebih dahulu, kemudian menggunakan kembali operasi yang ada pada nilai hingga dari tipe asli.
Mungkin ada atau mungkin tidak ada pola umum tentang manfaat atau tidaknya mengadopsi konvensi penanganan infinitas sisi kiri sebelum infinitas sisi kanan atau sebaliknya; Saya tidak tahu tanpa mencobanya, tetapi untuk kurang dari atau sama (
lteq
) saya pikir lebih mudah untuk melihat infinity sisi kanan terlebih dahulu. Saya perhatikan bahwalteq
ini tidak komutatif, tetapiadd
danmul
adalah; mungkin itu relevan.Catatan: mendapatkan definisi yang baik tentang apa yang seharusnya terjadi pada nilai tak terbatas tidak selalu mudah. Ini untuk perbandingan, penjumlahan dan perkalian, tapi mungkin bukan pengurangan. Juga, ada perbedaan antara bilangan kardinal dan ordinal tak terhingga yang mungkin ingin Anda perhatikan.
sumber
-(yourvalue)
berfungsi dengan baik. Dan itu juga akan memungkinkan Anda untuk mendukung konsep NaN (bukan angka). Selain itu, menambahkan nilai khusus di atas tipe integral bisa menjadi ide yang baik, terutama ketika aplikasi membutuhkan semantik yang dilanggar oleh bilangan floating point.Karena nomor kelas belum final, ini adalah ide, yang belum saya temukan di posting lain. Yakni untuk mensubkelas Nomor kelas.
Ini entah bagaimana akan mengirimkan objek yang dapat diperlakukan sebagai tak terhingga untuk Integer, Long, Double, Float, BigInteger dan BigDecimal.
Karena hanya ada dua nilai, kita bisa menggunakan pola singleton:
public final class Infinity extends Number { public final static Infinity POSITIVE = new Infinity(false); public final static Infinity NEGATIVE = new Infinity(true); private boolean negative; private Infinity(boolean n) { negative = n; } }
Entah bagaimana saya pikir metode yang tersisa intValue (), longValue () dll .. kemudian harus diganti untuk membuang pengecualian. Sehingga nilai infinity tidak bisa digunakan tanpa tindakan pencegahan lebih lanjut.
sumber
Saya seorang pemula di Java ... Saya menemukan implementasi lain untuk infinity dalam dokumentasi Java, untuk
boolean
dandouble
tipe. https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.3Ini terlihat jelek, tapi berhasil.
public class Main { public static void main(String[] args) { System.out.println(1.0/0.0); System.out.println(-1.0/0.0); } }
sumber