Mungkinkah pernyataan (x != x) bernilai TRUE?

Artikel ini diperuntukan bagi para programmer yang suka membuat kode-kode program. Bagi programmer C, C++, Java, atau yang lainnya mungkin tak asing lagi dengan operator “!=” (tidak sama dengan). Nah, kalo misalkan ada pernyataan (x != x), apakah pernyataan itu selalu menghasilkan nilai FALSE?

Sekilas, secara naluri, secara logika, jika ada pernyataan x tidak sama dengan x atau (x != x), jawabannya adalah salah (FALSE). Kemudian saya mengajukan pertanyaan, apa mungkin (x != x) menjadi bernilai benar? jawabannya adalah mungkin.

Kok bisa? mungkin Anda beranggapan bahwa tidak mungkin pernyataan tersebut bernilai TRUE. Saya pernah mengajukan pertanyaan ini dan saat itu saya sempat dibilang aneh. Bukan cuma satu dua orang yang pernah bilang saya aneh, jadi wajar saja kalau Anda pun bilang bahwa saya aneh!

Oke, saya coba jelaskan. Secara logika, memang x != x akan selalu bernilai FALSE. Tetapi, jika diimplementasikan dalam komputer, hal itu berbeda. Kenapa? komputer itu hanyalah mesin pemodelan dari kenyataan. Komputer itu mesin yang memiliki keterbatasan. Sebagai contoh, 64 + 64 secara logika seharusnya bernilai 128. Tapi dalam mesin komputer dengan bilangan signed 8-bit, 64 + 64 menghasilkan nilai -128. Kenapa? ya karena untuk bilangan signed 8-bit, komputer hanya mengenali bilangan antara -128 hingga 127.

Lalu, bilamana x != x bernilai TRUE? jawabannya adalah bila x bilangan floating point dan bernilai NaN (Not a Number).

Kok bisa begitu? saya ulangi lagi, ini adalah keterbatasan dari komputer. Bilangan floating point (atau bisa dibilang bilangan real), dalam komputer juga memiliki keterbatasan. Misalnya, operasi 0 (nol) dibagi 0 (nol) seharusnya menghasilkan nilai tidak terdefinisi. Dalam bilangan floating point (IEEE 754), operasi nol dibagi nol akan menghasilkan bilangan NaN. Bilangan NaN inilah yang menjadi sumber permasalahan logika di komputer. Jika x bernilai NaN, maka pernyataan x != x akan menjadi bernilai TRUE.

Penjelasan lebih rinci, saya coba mengutip salah satu artikel dari Java Virtual Machine Specification

Potongan isi artikel tersebut kira-kira sebagai berikut:
“NaN is unordered, so the numerical comparison operators <, <=, >, and >= return false if either or both operands are NaN. The equality operator == returns false if either operand is NaN, and the inequality operator != returns true if either operand is NaN. In particular, x != x is true if and only if x is NaN, and (x<y) == !(x>=y) will be false if x or y is NaN.”

Atau bisa melihat artikel dari wikipedia

Potongan isi artikel tersebut kira-kira sebagai berikut:
“A NaN does not compare equal to any floating-point number or NaN, even if the latter has an identical representation. One can therefore test whether a variable has a NaN value by comparing it to itself (i.e. if x != x then x is NaN).”

Jadi, dapat dibuktikan bahwa pernyataan (x != x) bisa jadi bernilai TRUE. ^^
Sekarang, masihkah Anda menyebutkan bahwa saya ini aneh? hehehe..

Wah, kalo begitu, komputer ga bisa dipercaya dong? Hmmm… bukan begitu. Kalo kita menggunakan komputer, ya kita harus kenal dulu bagaimana sih cara kerja si komputer, batasan-batasannya apa saja, dan kita harus mengikuti batasan-batasan tersebut. ^^ Kalo sudah begitu, komputer bisa jadi alat yang sangat bermanfaat untuk kemaslahatan umat manusia! Betul!

Oya, buat yang belum percaya akan kenyataan ini, cobalah gunakan kode program berikut:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    float x = 0.0/0.0;

    if ( x != x )
        printf(“sekarang, percaya kan? ^^\n”);

    system(“PAUSE”);
    return 0;
}

Hehe… semoga artikel ini bisa bermanfaat.^^v

4 Balasan ke Mungkinkah pernyataan (x != x) bernilai TRUE?

  1. Randy mengatakan:

    Wow.. pertamanya ga percaya… kalo dilihat dari matematika teoritis…
    tapi kalo udah dalam komputer, batasan2 mesin komputer harus diperhatikan.
    Sip, nice article.

  2. baguspewe mengatakan:

    Yap.. saya juga sebelumnya ga percaya sampai akhirnya saya coba, dan ternyata memang benar!! ^^

  3. rita mengatakan:

    Kalau soal seperti ini udah pernah (aku tanyakan) apa belum ya?

    if (x)
    printf(“Hello “)
    else
    printf(“World!”)

    Kapan “Hello World” akan tampil di layar?

  4. baguspewe mengatakan:

    Dulu pernah saya jawab kan?
    jawabannya kalo ada kode seperti ini

    x = 1;
    do
    {
      if (x)
        printf(“Hello “);
      else
        printf(“World!”);
      x = !x;
    } while (!x)

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: