Setiap nilai numerik yang kita simpan di variabel menempati memori dengan ketelitian tertentu. MATLAB memilih double sebagai kelas default, tetapi menyediakan kelas single dan sepuluh kelas integer untuk situasi saat memori dan jangkauan lebih penting daripada presisi. Memilih kelas yang tepat menentukan akurasi hasil, kecepatan komputasi, dan besar memori program kita. Pada Chapter ini kita akan memetakan seluruh kelas numerik MATLAB, mengukur konsumsi memorinya, dan memahami perilaku saturasi pada integer.

Double: Kelas Default MATLAB #

Ketika kita menulis a = 3.14, MATLAB menyimpan nilai tersebut sebagai array 1×1 kelas double: bilangan titik mengambang 64-bit mengikuti standar IEEE 754. Satu elemen double menempati 8 byte dan membawa sekitar 15-16 digit signifikan — cukup untuk hampir semua komputasi teknik dan saintifik. Karena double adalah default, semua literal numerik, hasil 7/3, hingga konstanta seperti pi berada di kelas ini tanpa perlu perintah tambahan.

Batas atas dan bawah double bisa kita periksa dengan konstanta realmax, realmin, dan eps:

matlab
fprintf('class 3.14 : %s\n', class(3.14));
fprintf('realmax     : %g\n', realmax);
fprintf('realmin     : %g\n', realmin);
fprintf('eps         : %g\n', eps);

Output yang Dihasilkan:

text
class 3.14 : double
realmax     : 1.79769e+308
realmin     : 2.22507e-308
eps         : 2.22045e-16

Mari kita bedah baris-baris kode di atas:

  1. Baris 1 (class(3.14)): fungsi class() mengembalikan nama kelas datanya sebagai teks, yaitu double.
  2. Baris 2 (realmax): bilangan hingga terbesar yang dapat direpresentasikan double, sekitar 1.7977×10³⁰⁸. Nilai yang melewatinya menjadi Inf.
  3. Baris 3 (realmin): bilangan positif ternormalisasi terkecil, sekitar 2.2251×10⁻³⁰⁸ — bukan nol, melainkan batas bawah presisi.
  4. Baris 4 (eps): jarak menuju double berikutnya dari angka 1 (sekitar 2.22×10⁻¹⁶); inilah ukuran “butir” presisi double yang kita bahas lagi pada Chapter Operator Perbandingan.

Single dan Sepuluh Kelas Integer #

Kelas single menggunakan 32-bit (4 byte per elemen) dengan sekitar 7 digit signifikan, sedangkan kelas integer terbagi menjadi bertanda (int8 sampai int64) dan tak bertanda (uint8 sampai uint64). Tabel berikut merangkum jangkauan dan konsumsi memori tiap kelas:

KelasJangkauanByte per elemen
double±1.7977e+308, ~15-16 digit signifikan8
single±3.4028e+38, ~7 digit signifikan4
int8-128 s.d. 1271
int16-32768 s.d. 327672
int32-2147483648 s.d. 21474836474
int64-9223372036854775808 s.d. 92233720368547758078
uint80 s.d. 2551
uint160 s.d. 655352
uint320 s.d. 42949672954
uint640 s.d. 184467440737095516158

Konversi ke kelas lain dilakukan eksplisit lewat fungsi yang namanya sama dengan kelasnya: single(x), int8(x), uint8(x), dan seterusnya. Batas tiap kelas integer dapat ditanyakan kapan saja dengan intmax() dan intmin():

matlab
fprintf('class single(pi) : %s\n', class(single(pi)));
fprintf('class int8(100)  : %s\n', class(int8(100)));
fprintf('intmax int8 : %d\n', intmax('int8'));
fprintf('intmin int8 : %d\n', intmin('int8'));
fprintf('intmax uint8: %d\n', intmax('uint8'));

Output yang Dihasilkan:

text
class single(pi) : single
class int8(100)  : int8
intmax int8 : 127
intmin int8 : -128
intmax uint8: 255

Mari kita bedah baris-baris kode di atas:

  1. Baris 1 (single(pi)): nilai pi (kelas double) dikonversi ke single; fungsi class() memastikan hasilnya benar berpindah kelas.
  2. Baris 2 (int8(100)): nilai 100 dikonversi ke integer 8-bit bertanda; hasil cetak %d menampilkan angka bulat tanpa desimal.
  3. Baris 3-5 (intmax/intmin): kedua fungsi ini melaporkan batas atas dan batas bawah kelas yang ditanyakan — informasi penting sebelum kita memilih kelas integer untuk data kita.

Mengukur Konsumsi Memori dengan whos #

Perintah whos menampilkan seluruh variabel di workspace beserta kelas dan total byte yang dikonsumsi. Perhatikan sesi Command Window berikut:

matlab
>> a = 5; b = single(5); c = int8(5);
>> whos

Output yang Dihasilkan:

text
  Name      Size            Bytes  Class     Attributes

  a         1x1                 8  double
  b         1x1                 4  single
  c         1x1                 1  int8

Kolom Bytes memperlihatkan perbedaan nyata: satu elemen double memakan 8 byte, single 4 byte, dan int8 hanya 1 byte. Untuk array besar, penghematan berlipat: sebuah citra 12 megapiksel butuh 96 MB sebagai double, tetapi hanya 12 MB sebagai uint8 — format standar penyimpanan piksel citra.

Saturasi Integer, Bukan Wrap Around #

Perilaku paling mengejutkan bagi pemula: integer MATLAB tidak “berputar” (wrap around) seperti di C ketika melampaui jangkauan. MATLAB menjepit nilai ke batas terdekat, perilaku yang disebut saturasi. Konversi eksplisit dengan int8(300) maupun operasi aritmetika antar integer seperti int8(120) + int8(20) keduanya menjepit hasil ke intmax atau intmin:

matlab
fprintf('int8(300)  : %d\n', int8(300));
fprintf('uint8(-5)  : %d\n', uint8(-5));
fprintf('uint8(300) : %d\n', uint8(300));

Output yang Dihasilkan:

text
int8(300)  : 127
uint8(-5)  : 0
uint8(300) : 255

Mari kita bedah baris-baris kode di atas:

  1. Baris 1 (int8(300)): 300 melebihi batas atas int8 (127), sehingga hasil dijepit ke 127 — bukan 44 seperti yang dihasilkan wrap-around 8-bit di C.
  2. Baris 2 (uint8(-5)): kelas tak bertanda tidak mengenal bilangan negatif; nilai di bawah 0 dijepit ke 0.
  3. Baris 3 (uint8(300)): 300 di atas 255, hasil dijepit ke 255.

Satu detail penting lainnya: konversi ke kelas integer membulatkan ke bilangan bulat terdekat, bukan memotong desimal. int8(2.9) menghasilkan 3 dan int8(2.4) menghasilkan 2. Ketika kita ingin mengendalikan arah pembulatan sendiri, gunakan round, fix, floor, atau ceil dulu baru konversi — keempat fungsi ini kita bahas tuntas pada Chapter Konversi Tipe Data.

Berkas contoh.m pada bagian bawah halaman menguji kelas-kelas di atas secara utuh: class, intmax/intmin, pembulatan saat konversi, dan tiga kasus saturasi.

Ringkasan #

MATLAB default ke double 64-bit dengan ~15 digit presisi; single dan kelas integer menghemat memori dengan jangkauan lebih sempit. Perintah whos mengukur konsumsi memori aktual, intmax/intmin melaporkan batas kelas integer, dan operasi yang melampaui batas dijepit (saturasi), bukan dibungkus. Pemilihan kelas yang tepat menjaga program tetap hemat memori tanpa mengorbankan akurasi.