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 presisi quadruple (16-byte), dan format presisi ganda (10-byte), yang diterapkan beberapa pengkompilasi C dan C++ sebagai long double jenis data. Dalam kompilator MSVC, long double jenis data diperlakukan sebagai jenis yang berbeda, tetapi jenis penyimpanan memetakan ke double. Namun, ada dukungan bahasa intrinsik dan rakitan untuk komputasi menggunakan format lain, termasuk format presisi ganda yang diperluas, di mana didukung oleh perangkat keras.

Nilai disimpan sebagai berikut:

Nilai Disimpan sebagai
presisi tunggal sign bit, eksponen 8-bit, significand 23-bit
presisi ganda sign bit, 11-bit exponent, 52-bit significand

Dalam format presisi tunggal dan presisi ganda, ada 1 terkemuka yang diasumsikan di bagian pecahan. Bagian pecahan disebut significand (kadang-kadang dikenal sebagai mantissa). 1 terkemuka ini tidak disimpan dalam memori, jadi significand sebenarnya 24 atau 53 bit, meskipun satu bit lebih sedikit 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 Bias oleh
8-bit (presisi tunggal) 127
11-bit (presisi ganda) 1023

Eksponen ini bukan kekuatan sepuluh; mereka adalah kekuatan 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 fraksi biner dari formulir 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 sedih sehingga bit berurutan tinggi significand selalu 1. Karena bit ini selalu 1, diasumsikan (tidak disimpan) dalam format presisi tunggal dan presisi ganda. Titik biner (bukan desimal) diasumsikan hanya di sebelah kanan 1 di depan.

Format untuk representasi floating-point adalah sebagai berikut:

Format 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's adalah bit eksponen bias, dan M's adalah bit significand. 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 mewakili -0 sebagai nol dengan set bit tanda, tetapi -0 dan 0 selalu membandingkan sebagai sama.

Tak terbatas

Nilai ∞ +∞ dan −diwakili oleh eksponen dari semua nilai, dan significand yang semuanya 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 diwakili oleh eksponen dari semua yang dan significand non-nol. Ada dua jenis NaN, NaN tenang , atau QNaN, dan memberi sinyal NaN, atau SNaN. Quiet NaN memiliki yang terkemuka di significand, dan disebarluaskan melalui ekspresi. Mereka mewakili nilai yang tidak ditentukan, seperti hasil pembagian dengan tak terbatas, atau mengalikan tak terbatas dengan nol. Signaling NaN memiliki nol di depan di significand. 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. Significand biner yang disimpan adalah (1.) 000 0000 0000 0000 0000 0000, yang memiliki 1 dan titik biner tersirat, sehingga significand aktual 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 diatur. Hal yang sama berlaku untuk negatif dari semua format IEEE angka floating-point.

    Nilai Rumus Representasi biner Heksadesimal
    -2 -1 * 21 1100 0000 0000 0000 0000 0000 0000 0000 0xC0000000
  • Nilai 4. Significand yang sama, eksponen meningkat satu (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 yang sama, significand lebih besar setengahnya. 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 kekuatan lain dari dua, eksponen bias adalah satu kurang dari dua 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. Significand tersimpan dibulatkan di bit terakhir dalam upaya untuk mewakili angka yang tidak dapat diprediksi 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 Angka Titik-Mengambang Dapat Kehilangan Presisi