Saya hanya punya pertanyaan yang tidak bisa saya jawab.
Misalkan Anda memiliki definisi loop ini di Jawa:
while (i == i) ;
Apa jenis idan nilai ijika loop bukan infinite loop dan program hanya menggunakan satu utas ?
Saya hanya punya pertanyaan yang tidak bisa saya jawab.
Misalkan Anda memiliki definisi loop ini di Jawa:
while (i == i) ;
Apa jenis idan nilai ijika loop bukan infinite loop dan program hanya menggunakan satu utas ?
Jawaban:
double i = Double.NaN;
API untuk Double.equals () merinci jawabannya: "Double.NaN == Double.NaN memiliki nilai false". Ini dijabarkan dalam Spesifikasi Bahasa Jawa di bawah " Tipe Titik-Apung, Format, dan Nilai ":
NaNadalah unordered, sehingga numerik operator perbandingan<,<=,>, dan>=kembalifalsejika salah satu atau kedua operanNaN. Operator kesetaraan==kembalifalsejika salah satu operanNaN, dan operator ketidaksetaraan!=kembalitruejika salah satu operanNaN. Secara khusus,x!=xadalahtruejika dan hanya jikaxyaituNaN, dan(x<y) == !(x>=y)akanfalsejikaxatauyadalahNaN.
x == xharus selalu benar. Mengapa sesuatu tidak sama dengan dirinya sendiri?
null=nulladalah nol. NULL IS NULLadalah 1.
Nilai iini kemudian tidak valid. "Bukan Angka".
Setelah beberapa googling, saya menemukan bahwa Anda BISA memiliki NaN (Bukan Angka) di Jawa! Jadi, angka Float Pointing adalah Tipe Data dan Nilainya adalah NaN. Lihat di sini
double i = Double.NaN;
NaN tidak sama dengan apa pun, termasuk dirinya sendiri.
float i = Float.NaN;
while(i == i) ;
System.out.println("Not infinite!");
Karena yang lain bilang itu NaN, saya jadi penasaran dengan implementasi (JDK 6) resmi Double.isNaN, dan lihat:
/**
* Returns <code>true</code> if the specified number is a
* Not-a-Number (NaN) value, <code>false</code> otherwise.
*
* @param v the value to be tested.
* @return <code>true</code> if the value of the argument is NaN;
* <code>false</code> otherwise.
*/
static public boolean isNaN(double v) {
return (v != v);
}
Pikirkan Nan sebagai ekuivalen pengecualian tetapi menggunakan nilai ajaib dalam perhitungan. Karena perhitungan gagal - misalnya akar kuadrat dari negatif, bagi dengan nol dll - tidak masuk akal membandingkannya dengan yang lain. Lagi pula jika bagi dengan nol adalah nan apakah itu setara dengan akar kuadrat -2 atau kuadrat -3?
Nan memungkinkan perhitungan yang mencakup langkah yang mengembalikan jawaban yang tidak valid untuk diselesaikan tanpa memasukkan pengecualian tambahan. Untuk memverifikasi jawabannya adalah nilai, cukup tes untuk ketidakberesan (apakah itu kata jika tidak saya kemas) melalui Float.isNan () atau yang setara.
Saya akan menambahkan
float i = Float.NaN;
sebaik
double i = Double.NaN;
Trik umum dalam pertanyaan-pertanyaan semacam ini adalah dengan asumsi Anda membuat saya adalah seorang int. Asumsi umum lainnya yang mungkin adalah s adalah String, x, y adalah dobel, ch adalah char, b adalah byte dll. Jika Anda melihat pertanyaan seperti ini, Anda dapat bertaruh bahwa 'i' bukan tipe harapannya.
Pertanyaan serupa adalah; Ini tidak pernah berulang, apa itu 'x'
while(x == x && x != x + 0) { }
Pertanyaan lain yang saya sukai adalah; Loop ini adalah loop tak terbatas, berapakah nilai yang mungkin dari x. (: Saya hitung dua belas dari mereka :)
while(x != 0 && x == -x) { }
Saya tahu ini adalah pertanyaan Java, tetapi mempertimbangkan pertanyaan untuk bahasa lain sangat menarik.
Dalam C, tipe sederhana seperti 'int' dapat menunjukkan 'berakhir sebelum alam semesta menjadi dingin' perilaku jika 'i' dinyatakan sebagai volatile (sehingga kompiler akan dipaksa untuk melakukan dua pembacaan 'i' untuk setiap iterasi) dan jika 'i' benar-benar ada di memori di mana sesuatu yang lain dapat memengaruhinya. Maka loop akan berakhir ketika 'i' berubah antara dua bacaan dari satu iterasi. ( Ditambahkan : tempat yang memungkinkan - di komputer mikro di mana 'i' sebenarnya terletak di alamat port I / O, mungkin terhubung ke sensor posisi. Akan lebih masuk akal jika 'i' adalah variabel penunjuk ( pointer ke memori volatile) dan pernyataannya adalah ' while (*i == *i);'.)
Sebagaimana dibuktikan oleh jawaban lain, dalam C ++, operator '==' dapat diberikan oleh pengguna jika saya adalah kelas yang ditentukan pengguna, jadi apa pun mungkin terjadi.
Alih-alih seperti NaN, dalam bahasa berbasis SQL, loop tidak akan terbatas jika nilai saya adalah NULL; Namun, nilai non-NULL apa pun akan membuat loop tak terbatas. Ini agak seperti Java, di mana angka apa pun (sebagai lawan dari NaN) membuat loop tak terbatas.
Saya tidak melihat konstruksinya memiliki penggunaan praktis, tetapi ini adalah pertanyaan trivia yang menarik.
Saya terkejut tidak melihat solusi ini:
while (sin(x) == sin(x)) //probably won't eval to true
Menanggapi komentar, coba jalankan ini:
double x = 10.5f;
assert (x == asin(sin(x)));
x harus selalu sama dengan arcsine (sin (x)) dalam teori, tetapi dalam praktiknya tidak.
x, yang akan menghasilkan hasil yang sama persis dengan ketidaktepatan yang sama persis. Arcsin tidak dapat membalikkan hasil dosa dengan angka floating point karena nilai yang diteruskan asin()tidak akan akurat. Karena itu, hasilnya asin()akan tidak akurat, membuat x == asin(sin(x))salah. Juga, arcsin tidak harus "membatalkan" operasi dosa - fungsi dosa dapat memberikan hasil yang sama untuk beberapa nilai x, yang mengapa asin()hanya mengembalikan angka antara -π / 2 dan π / 2.
i == ibukan atom. Terbukti oleh program tersebut:
static volatile boolean i = true;
public static void main(String[] args) throws InterruptedException
{
new Thread() {
@Override
public void run() {
while (true) {
i = !i;
}
}
}.start();
while (i == i) ;
System.out.println("Not atomic! i: " + i);
}
Perbarui Berikut ini adalah satu lagi contoh loop tidak-tak terbatas (tidak ada utas baru yang dibuat).
public class NoNewThreads {
public static void main(String[] args) {
new NoNewThreads();
System.gc();
int i = 500;
System.out.println("Still Running");
while (i == i) ;
}
@Override
protected void finalize() throws Throwable {
super.finalize();
Thread.sleep(1000);
System.exit(0);
}
}
while (i == i);tidak akan pernah dijalankan.