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:
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:
class 3.14 : double
realmax : 1.79769e+308
realmin : 2.22507e-308
eps : 2.22045e-16Mari kita bedah baris-baris kode di atas:
- Baris 1 (
class(3.14)): fungsiclass()mengembalikan nama kelas datanya sebagai teks, yaitudouble. - Baris 2 (
realmax): bilangan hingga terbesar yang dapat direpresentasikandouble, sekitar 1.7977×10³⁰⁸. Nilai yang melewatinya menjadiInf. - Baris 3 (
realmin): bilangan positif ternormalisasi terkecil, sekitar 2.2251×10⁻³⁰⁸ — bukan nol, melainkan batas bawah presisi. - Baris 4 (
eps): jarak menujudoubleberikutnya dari angka 1 (sekitar 2.22×10⁻¹⁶); inilah ukuran “butir” presisidoubleyang 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:
| Kelas | Jangkauan | Byte per elemen |
|---|---|---|
double | ±1.7977e+308, ~15-16 digit signifikan | 8 |
single | ±3.4028e+38, ~7 digit signifikan | 4 |
int8 | -128 s.d. 127 | 1 |
int16 | -32768 s.d. 32767 | 2 |
int32 | -2147483648 s.d. 2147483647 | 4 |
int64 | -9223372036854775808 s.d. 9223372036854775807 | 8 |
uint8 | 0 s.d. 255 | 1 |
uint16 | 0 s.d. 65535 | 2 |
uint32 | 0 s.d. 4294967295 | 4 |
uint64 | 0 s.d. 18446744073709551615 | 8 |
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():
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:
class single(pi) : single
class int8(100) : int8
intmax int8 : 127
intmin int8 : -128
intmax uint8: 255Mari kita bedah baris-baris kode di atas:
- Baris 1 (
single(pi)): nilaipi(kelasdouble) dikonversi kesingle; fungsiclass()memastikan hasilnya benar berpindah kelas. - Baris 2 (
int8(100)): nilai 100 dikonversi ke integer 8-bit bertanda; hasil cetak%dmenampilkan angka bulat tanpa desimal. - 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:
>> a = 5; b = single(5); c = int8(5);
>> whosOutput yang Dihasilkan:
Name Size Bytes Class Attributes
a 1x1 8 double
b 1x1 4 single
c 1x1 1 int8Kolom 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:
fprintf('int8(300) : %d\n', int8(300));
fprintf('uint8(-5) : %d\n', uint8(-5));
fprintf('uint8(300) : %d\n', uint8(300));Output yang Dihasilkan:
int8(300) : 127
uint8(-5) : 0
uint8(300) : 255Mari kita bedah baris-baris kode di atas:
- Baris 1 (
int8(300)): 300 melebihi batas atasint8(127), sehingga hasil dijepit ke 127 — bukan 44 seperti yang dihasilkan wrap-around 8-bit di C. - Baris 2 (
uint8(-5)): kelas tak bertanda tidak mengenal bilangan negatif; nilai di bawah 0 dijepit ke 0. - 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.