Bagikan melalui


Representasi Titik Mengambang IEEE

Microsoft C++ (MSVC) konsisten dengan standar numerik IEEE. Standar IEEE-754 menjelaskan format floating-point, cara untuk mewakili angka nyata dalam perangkat keras. Setidaknya ada lima format internal untuk angka floating-point yang dapat diwakili dalam perangkat keras yang ditargetkan oleh pengkompilasi MSVC. Pengkompilasi hanya menggunakan dua di antaranya. Format presisi tunggal (4 byte) dan presisi ganda (8-byte) digunakan dalam MSVC. Presisi tunggal dinyatakan menggunakan kata kunci float. Presisi ganda dinyatakan menggunakan kata kunci double. Standar IEEE juga menentukan format setengah presisi (2 byte) dan format presisi kuadruple (16 byte), dan format presisi ganda-diperpanjang (10 byte), yang diterapkan beberapa pengkompilasi C dan C++ sebagai long double jenis data. Dalam kompilator MSVC, long double tipe data diperlakukan sebagai tipe yang terpisah, tetapi tipe penyimpanan memetakan ke double. Namun, ada dukungan bahasa intrinsik dan bahasa rakitan untuk komputasi menggunakan format lain, termasuk format presisi ganda yang diperluas, jika didukung oleh perangkat keras.

Nilai disimpan sebagai berikut:

Nilai Disimpan sebagai
presisi tunggal bit tanda, eksponen 8-bit, angka signifikan 23-bit
presisi ganda bit tanda, eksponen 11-bit, mantisa 52-bit

Dalam format presisi tunggal dan presisi ganda, ada angka 1 yang diasumsikan sebagai awal di bagian pecahan. Bagian pecahan disebut significand (kadang-kadang dikenal sebagai mantissa). 1 terkemuka ini tidak disimpan dalam memori, jadi signifika sebenarnya memiliki panjang 24 atau 53 bit, meskipun satu bit kurang yang disimpan. Format presisi ganda yang diperluas benar-benar menyimpan bit ini.

Eksponen dibiaskan oleh setengah dari kemungkinan nilainya. Ini berarti Anda mengurangi bias ini dari eksponen tersimpan untuk mendapatkan eksponen aktual. Jika eksponen yang disimpan kurang dari bias, sebenarnya eksponen negatif.

Eksponen dibiaskan sebagai berikut:

Eksponen Terpengaruh oleh bias
8-bit (presisi tunggal) 127
11-bit (presisi ganda) 1023

Eksponen ini bukan pangkat sepuluh; melainkan pangkat dua. Artinya, eksponen tersimpan 8-bit dapat berkisar dari -127 hingga 127, disimpan sebagai 0 hingga 254. Nilai 2127 kira-kira setara dengan 1038, yang merupakan batas aktual presisi tunggal.

Significand disimpan sebagai pecahan biner dalam bentuk 1.XXX... . Pecahan ini memiliki nilai yang lebih besar dari atau sama dengan 1 dan kurang dari 2. Angka riil selalu disimpan dalam bentuk yang dinormalisasi. Artinya, significand digeser ke kiri sehingga bit orde tinggi dari significand selalu 1. Karena bit ini selalu 1, diasumsikan (tidak disimpan) dalam format presisi tunggal dan presisi ganda. Titik biner (bukan desimal) diasumsikan berada tepat di sebelah kanan dari angka '1' terdepan.

Format untuk representasi floating-point adalah sebagai berikut:

Rancangan byte 1 byte 2 byte 3 byte 4 ... byte n
presisi tunggal SXXXXXXX XMMMMMMM MMMMMMMM MMMMMMMM
presisi ganda SXXXXXXX XXXXMMMM MMMMMMMM MMMMMMMM ... MMMMMMMM

S mewakili bit tanda, X adalah bit eksponen bias, dan M adalah bit magnitudo. Bit paling kiri diasumsikan dalam format presisi tunggal dan presisi ganda.

Untuk menggeser titik biner dengan benar, pertama-tama Anda melepas bias eksponen lalu memindahkan titik biner ke kanan atau meninggalkan jumlah bit yang sesuai.

Nilai khusus

Format floating-point mencakup beberapa nilai yang diperlakukan secara khusus.

Nol

Nol tidak dapat dinormalisasi, yang membuatnya tidak dapat diprediksi dalam bentuk nilai presisi tunggal atau presisi ganda yang dinormalisasi. Pola bit khusus dari semua nol mewakili 0. Dimungkinkan juga untuk merepresentasikan -0 sebagai nol dengan bit tanda diatur, namun -0 dan 0 selalu dibandingkan sebagai sama.

Tak terbatas

Nilai +∞ dan −∞ diwakili oleh eksponen berbentuk semua angka satu, dan significand yang seluruhnya nol. Positif dan negatif diwakili dengan menggunakan bit tanda.

Subnormal

Dimungkinkan untuk mewakili jumlah besaran yang lebih kecil daripada angka terkecil dalam bentuk yang dinormalisasi. Mereka disebut angka subnormal atau denormal . Jika eksponen adalah semua nol dan significand bukan nol, maka bit terdepan implisit dari significand dianggap nol, bukan satu. Presisi angka subnormal turun saat jumlah nol di depan dalam significand naik.

NaN - Bukan Angka

Dimungkinkan untuk mewakili nilai yang bukan bilangan riil, seperti 0/0, dalam format titik mengambang IEEE. Nilai semacam ini disebut NaN. NaN adalah nilai dengan eksponen berupa semua angka satu dan significand yang tidak nol. Ada dua jenis NaN, NaN tenang , atau QNaN, dan memberi sinyal NaN, atau SNaN. Quiet NaN memiliki angka satu terdepan pada significand, dan diteruskan melalui ekspresi. Mereka mewakili nilai yang tidak ditentukan, seperti hasil pembagian dengan tak terbatas, atau mengalikan tak terbatas dengan nol. Signaling NaN memiliki angka 0 di awal dari mantissa. Mereka digunakan untuk operasi yang tidak valid, untuk memberi sinyal pengecualian perangkat keras floating-point.

Contoh

Berikut ini adalah beberapa contoh dalam format presisi tunggal:

  • Untuk nilai 2, bit tanda adalah nol. Eksponen yang disimpan adalah 128, atau 1000 0000 dalam biner, yaitu 127 ditambah 1. Mantissa biner yang disimpan adalah (1.) 000 0000 0000 0000 0000 0000, yang memiliki angka 1 di depan dan titik desimal biner yang tersirat, sehingga mantissa sebenarnya adalah satu.

    Nilai Rumus Representasi biner Heksadesimal
    2 1 * 21 0100 0000 0000 0000 0000 0000 0000 0000 0x40000000
  • Nilai -2. Sama seperti +2 kecuali bahwa bit tanda disetel. Hal yang sama berlaku untuk negatif semua bilangan dalam format IEEE.

    Nilai Rumus Representasi biner Heksadesimal
    -2 -1 * 21 1100 0000 0000 0000 0000 0000 0000 0000 0xC0000000
  • Nilai 4. Significand yang sama, eksponen naik satu tingkat (nilai bias adalah 129, atau 100 0000 1 dalam biner).

    Nilai Rumus Representasi biner Heksadesimal
    4 1 * 22 0100 0000 1000 0000 0000 0000 0000 0000 0x40800000
  • Nilai 6. Eksponen sama, significand lebih besar setengah kali. Ini (1.) 100.0000 ... 0000 0000, yang, karena merupakan pecahan biner, adalah 1 1/2 karena nilai digit pecahan adalah 1/2, 1/4, 1/8, dan sebagainya.

    Nilai Rumus Representasi biner Heksadesimal
    6 1,5 * 22 0100 0000 1100 0000 0000 0000 0000 0000 0x40C00000
  • Nilai 1. Significand yang sama dengan bilangan pangkat dua lainnya, eksponen bias adalah satu kurang dari dua, yaitu pada 127, atau 011 1111 1 dalam biner.

    Nilai Rumus Representasi biner Heksadesimal
    1 1 * 20 0011 1111 1000 0000 0000 0000 0000 0000 0x3F800000
  • Nilai 0,75. Eksponen bias adalah 126, 011 1111 0 dalam biner, dan significand adalah (1.) 100 0000 ... 0000 0000, yaitu 1 1/2.

    Nilai Rumus Representasi biner Heksadesimal
    0,75 1,5 * 2-1 0011 1111 0100 0000 0000 0000 0000 0000 0x3F400000
  • Nilai 2,5. Sama persis dengan dua kecuali bahwa bit yang mewakili 1/4 diatur dalam significand.

    Nilai Rumus Representasi biner Heksadesimal
    2,5 1,25 * 21 0100 0000 0010 0000 0000 0000 0000 0000 0x40200000
  • 1/10 adalah pecahan berulang dalam biner. Significand sedikit kurang dari 1,6, dan eksponen bias mengatakan bahwa 1,6 akan dibagi dengan 16. (Ini adalah 011 1101 1 dalam biner, yaitu 123 dalam desimal.) Eksponen sejati adalah 123 - 127 = -4, yang berarti bahwa faktor yang akan dikalikan adalah 2-4 = 1/16. Mantisa yang tersimpan dibulatkan di bit terakhir dalam upaya untuk mewakili angka yang tidak dapat diwakili seakurat mungkin. (Alasan bahwa 1/10 dan 1/100 tidak benar-benar dapat diwakili dalam biner mirip dengan alasan bahwa 1/3 tidak benar-benar dapat direpresentasikan dalam desimal.)

    Nilai Rumus Representasi biner Heksadesimal
    0.1 1,6 * 2-4 0011 1101 1100 1100 1100 1100 1100 1101 0x3DCCCCCD
  • Nol adalah kasus khusus. Ini menggunakan rumus untuk nilai positif minimum yang mungkin dapat diwakili, yang semuanya nol.

    Nilai Rumus Representasi biner Heksadesimal
    0 1 * 2-128 0000 0000 0000 0000 0000 0000 0000 0000 0x00000000

Lihat juga

Mengapa Bilangan Titik Mengambang Dapat Kehilangan Presisi