Apa perbedaan antara operasi floating point presisi tunggal dan presisi ganda?

169

Apa perbedaan antara operasi floating point presisi tunggal dan operasi floating presisi ganda?

Saya terutama tertarik pada istilah praktis terkait dengan konsol video game. Sebagai contoh, apakah Nintendo 64 memiliki prosesor 64 bit dan jika itu terjadi maka apakah itu berarti mampu melakukan operasi floating point presisi ganda? Dapatkah PS3 dan Xbox 360 melakukan operasi floating point presisi ganda atau hanya presisi tunggal dan secara umum adalah kemampuan presisi ganda yang digunakan (jika ada?).

tweetypi
sumber
17
Fakta bahwa CPU 64-bit biasanya berarti bahwa CPU memiliki register tujuan umum 64-bit (yaitu integer) dan ukuran alamat memori . Tapi itu tidak mengatakan apa-apa tentang matematika floating point. Sebagai contoh, Intel IA-32 CPU 32-bit, tetapi mereka secara alami mendukung pelampung presisi ganda.
Roman Zavalov

Jawaban:

215

Catatan: Nintendo 64 memang memiliki prosesor 64-bit, namun:

Banyak game mengambil keuntungan dari mode pemrosesan 32-bit chip karena presisi data yang lebih besar tersedia dengan tipe data 64-bit biasanya tidak diperlukan oleh game 3D, serta fakta bahwa pemrosesan data 64-bit menggunakan RAM dua kali lebih banyak, cache , dan bandwidth, sehingga mengurangi kinerja sistem secara keseluruhan.

Dari Webopedia :

Istilah presisi ganda adalah sesuatu yang keliru karena presisi tidak benar-benar ganda.
Kata double berasal dari fakta bahwa angka presisi ganda menggunakan bit dua kali lebih banyak daripada angka floating-point biasa.
Misalnya, jika angka presisi tunggal membutuhkan 32 bit, panjang presisi gandanya akan menjadi 64 bit.

Bit tambahan meningkatkan tidak hanya presisi tetapi juga rentang besaran yang dapat direpresentasikan.
Jumlah pasti yang digunakan untuk meningkatkan presisi dan rentang magnitudo tergantung pada format apa yang digunakan program untuk mewakili nilai floating-point.
Sebagian besar komputer menggunakan format standar yang dikenal sebagai format titik-mengambang IEEE.

Format presisi ganda IEEE sebenarnya bit bit presisi lebih dari dua kali lipat format presisi tunggal, serta rentang yang jauh lebih besar.

Dari standar IEEE untuk aritmatika floating point

Presisi tunggal

Representasi standar floating point presisi tunggal IEEE membutuhkan 32 bit kata, yang dapat direpresentasikan sebagai nomor dari 0 hingga 31, dari kiri ke kanan.

  • Bit pertama adalah bit tanda , S,
  • delapan bit berikutnya adalah bit eksponen , 'E', dan
  • 23 bit terakhir adalah fraksi 'F':

    S EEEEEEEE FFFFFFFFFFFFFFFFFFFFFFF
    0 1      8 9                    31
    

Nilai V yang diwakili oleh kata dapat ditentukan sebagai berikut:

  • Jika E = 255 dan F adalah bukan nol, maka V = NaN ("Bukan angka")
  • Jika E = 255 dan F adalah nol dan S adalah 1, maka V = -Infinity
  • Jika E = 255 dan F adalah nol dan S adalah 0, maka V = Infinity
  • Jika 0<E<255kemudian di V=(-1)**S * 2 ** (E-127) * (1.F)mana "1.F" dimaksudkan untuk mewakili angka biner yang dibuat dengan awalan F dengan terkemuka 1 implisit dan titik biner.
  • Jika E = 0 dan F bukan nol, maka V=(-1)**S * 2 ** (-126) * (0.F). Ini adalah nilai-nilai "tidak dinormalisasi".
  • Jika E = 0 dan F adalah nol dan S adalah 1, maka V = -0
  • Jika E = 0 dan F adalah nol dan S adalah 0, maka V = 0

Khususnya,

0 00000000 00000000000000000000000 = 0
1 00000000 00000000000000000000000 = -0

0 11111111 00000000000000000000000 = Infinity
1 11111111 00000000000000000000000 = -Infinity

0 11111111 00000100000000000000000 = NaN
1 11111111 00100010001001010101010 = NaN

0 10000000 00000000000000000000000 = +1 * 2**(128-127) * 1.0 = 2
0 10000001 10100000000000000000000 = +1 * 2**(129-127) * 1.101 = 6.5
1 10000001 10100000000000000000000 = -1 * 2**(129-127) * 1.101 = -6.5

0 00000001 00000000000000000000000 = +1 * 2**(1-127) * 1.0 = 2**(-126)
0 00000000 10000000000000000000000 = +1 * 2**(-126) * 0.1 = 2**(-127) 
0 00000000 00000000000000000000001 = +1 * 2**(-126) * 
                                     0.00000000000000000000001 = 
                                     2**(-149)  (Smallest positive value)

Presisi ganda

Representasi standar floating point presisi ganda IEEE membutuhkan 64 bit kata, yang dapat direpresentasikan sebagai nomor dari 0 hingga 63, dari kiri ke kanan.

  • Bit pertama adalah bit tanda , S,
  • sebelas bit berikutnya adalah bit eksponen , 'E', dan
  • 52 bit terakhir adalah fraksi 'F':

    S EEEEEEEEEEE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
    0 1        11 12                                                63
    

Nilai V yang diwakili oleh kata dapat ditentukan sebagai berikut:

  • Jika E = 2047 dan F adalah nol, maka V = NaN ("Bukan angka")
  • Jika E = 2047 dan F adalah nol dan S adalah 1, maka V = -Infinity
  • Jika E = 2047 dan F adalah nol dan S adalah 0, maka V = Infinity
  • Jika 0<E<2047kemudian di V=(-1)**S * 2 ** (E-1023) * (1.F)mana "1.F" dimaksudkan untuk mewakili angka biner yang dibuat dengan awalan F dengan terkemuka 1 implisit dan titik biner.
  • Jika E = 0 dan F adalah bukan nol, maka V=(-1)**S * 2 ** (-1022) * (0.F)ini adalah nilai "tidak dinormalisasi".
  • Jika E = 0 dan F adalah nol dan S adalah 1, maka V = -0
  • Jika E = 0 dan F adalah nol dan S adalah 0, maka V = 0

Referensi:
Standar ANSI / IEEE 754-1985,
Standar untuk Aritmatika Binary Floating Point.

VONC
sumber
9
Saya tahu ini dari sumber Anda, tetapi saya tidak suka kalimatnya: "Istilah presisi ganda adalah sesuatu yang keliru karena presisinya tidak benar-benar ganda." Presisi tunggal dan ganda hari ini cukup universal ditentukan oleh IEEE, dan seperti yang Anda tunjukkan presisi tunggal memiliki 23 bit dalam fraksi dan ganda memiliki 52 bit - yang pada dasarnya menggandakan presisi ...
Carl Walsh
5
@ZeroDivide ' **' is Exponentiation
VonC
11
@CarlWalsh 52/23! = 2 ergo itu bukan "menggandakan presisi"
rfoo
@johnson Anda memiliki detail lebih lanjut tentang nilai-nilai yang tidak dinormalisasi di easy68k.com/paulrsm/6502/WOZFPPAK.TXT , dan juga di stackoverflow.com/a/28801033/6309
VonC
2
@rfoo Jika Anda ingin menjadi bertele-tele yakin, itu tidak persis ganda, tetapi 52/2> 23 jadi ya, itu adalah ganda presisi, itu hanya ganda dan kemudian beberapa lagi.
JShorthouse
42

Saya membaca banyak jawaban tetapi sepertinya tidak ada yang menjelaskan dari mana kata double berasal. Saya ingat penjelasan yang sangat baik yang diberikan oleh seorang profesor Universitas yang saya miliki beberapa tahun yang lalu.

Mengingat gaya jawaban VonC, representasi floating point presisi tunggal menggunakan kata 32 bit.

  • 1 bit untuk tanda , S
  • 8 bit untuk eksponen , 'E'
  • 24 bit untuk fraksi , juga disebut mantissa , atau koefisien (meskipun hanya 23 yang diwakili). Sebut saja 'M' (untuk mantissa , saya lebih suka nama ini karena "fraksi" bisa disalahpahami).

Perwakilan:

          S  EEEEEEEE   MMMMMMMMMMMMMMMMMMMMMMM
bits:    31 30      23 22                     0

(Hanya untuk menunjukkan, bit tanda adalah yang terakhir, bukan yang pertama.)

Sebuah ganda presisi floating point representasi menggunakan kata 64 bit.

  • 1 bit untuk tanda , S
  • 11 bit untuk eksponen , 'E'
  • 53 bit untuk fraksi / mantissa / koefisien (walaupun hanya 52 yang diwakili), 'M'

Perwakilan:

           S  EEEEEEEEEEE   MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
bits:     63 62         52 51                                                  0

Seperti yang Anda perhatikan, saya menulis bahwa mantissa memiliki, dalam kedua jenis, satu informasi sedikit lebih banyak dibandingkan dengan perwakilannya. Bahkan, mantissa adalah angka yang diwakili tanpa semua yang tidak signifikan 0. Sebagai contoh,

  • 0,000124 menjadi 0,124 × 10 −3
  • 237.141 menjadi 0,237141 × 10 3

Ini berarti mantissa akan selalu dalam bentuk

0.α 1 α 2 ... α t × β p

di mana β adalah basis representasi. Tetapi karena fraksi adalah bilangan biner, α 1 akan selalu sama dengan 1, sehingga fraksi dapat ditulis ulang sebagai 1.α 2 α 3 ... α t + 1 × 2 p dan inisial 1 dapat secara implisit diasumsikan, membuat ruang untuk bit ekstra (α t + 1 ).

Sekarang, jelas benar bahwa ganda 32 adalah 64, tapi itu bukan dari mana kata itu berasal.

The presisi menunjukkan jumlah angka desimal yang benar , yaitu tanpa jenis kesalahan representasi atau pendekatan. Dengan kata lain, ini menunjukkan berapa banyak angka desimal yang dapat digunakan dengan aman .

Dengan demikian, mudah untuk memperkirakan jumlah angka desimal yang dapat digunakan dengan aman:

  • presisi tunggal : log 10 (2 24 ), yaitu sekitar 7 ~ 8 digit desimal
  • presisi ganda : log 10 (2 53 ), yaitu sekitar 15 ~ 16 digit desimal
Alessandro
sumber
19

Oke, perbedaan mendasar pada mesin adalah bahwa presisi ganda menggunakan bit dua kali lebih banyak daripada tunggal. Dalam implementasi yang biasa, itu 32 bit untuk tunggal, 64 bit untuk ganda.

Tapi apa artinya ? Jika kita mengasumsikan standar IEEE, maka angka presisi tunggal memiliki sekitar 23 bit mantissa, dan eksponen maksimum sekitar 38; presisi ganda memiliki 52 bit untuk mantissa, dan eksponen maksimum sekitar 308.

Detailnya ada di Wikipedia , seperti biasa.

Charlie Martin
sumber
11

Untuk menambah semua jawaban indah di sini

Pertama-tama float dan double digunakan untuk representasi bilangan pecahan. Jadi, perbedaan antara keduanya bermula dari fakta dengan seberapa presisi mereka dapat menyimpan angka.

Sebagai contoh: Saya harus menyimpan 123.456789 Seseorang mungkin dapat menyimpan hanya 123.4567 sementara yang lain mungkin dapat menyimpan 123.456789 yang tepat.

Jadi, pada dasarnya kita ingin tahu seberapa akurat nomor itu dapat disimpan dan apa yang kita sebut presisi.

Mengutip @Alessandro di sini

Presisi menunjukkan jumlah digit desimal yang benar , yaitu tanpa kesalahan representasi atau aproksimasi. Dengan kata lain, ini menunjukkan berapa banyak angka desimal yang dapat digunakan dengan aman .

Float dapat secara akurat menyimpan sekitar 7-8 digit di bagian fraksional sementara Double dapat secara akurat menyimpan sekitar 15-16 digit di bagian fraksional

Jadi, float dapat menyimpan dua kali lipat jumlah bagian fraksional. Itulah mengapa Double dinamakan double the float

SimpleGuy
sumber
7

Mengenai pertanyaan "Bisakah ps3 dan xbxo 360 melakukan operasi floating point presisi ganda atau hanya presisi tunggal dan dalam penggunaan umum adalah kemampuan presisi ganda dimanfaatkan (jika ada?)."

Saya percaya bahwa kedua platform tidak mampu melakukan floating point ganda. Prosesor Cell asli hanya memiliki float 32 bit, sama dengan perangkat keras ATI yang menjadi dasar XBox 360 (R600). Cell mendapat dukungan floating point ganda nantinya, tapi saya cukup yakin PS3 tidak menggunakan chippery itu.

codekaizen
sumber
5

Pada dasarnya floating point aritmatika presisi tunggal berhubungan dengan angka-angka floating point 32 bit sedangkan presisi ganda berkaitan dengan 64 bit.

Jumlah bit dalam presisi ganda meningkatkan nilai maksimum yang dapat disimpan serta meningkatkan presisi (yaitu jumlah digit signifikan).

cletus
sumber
5

Semua telah menjelaskan dengan sangat rinci dan tidak ada yang bisa saya tambahkan lebih lanjut. Meskipun saya ingin menjelaskannya dalam Ketentuan Layman atau INGGRIS polos

1.9 is less precise than 1.99
1.99 is less precise than 1.999
1.999 is less precise than 1.9999

.....

Suatu variabel, yang mampu menyimpan atau merepresentasikan "1.9" memberikan ketelitian yang lebih rendah daripada yang mampu menampung atau mewakili 1.9999. Fraksi ini dapat berjumlah perbedaan besar dalam perhitungan besar.

Asad
sumber
2

Presisi ganda berarti angka-angka membutuhkan waktu dua kali panjang kata untuk disimpan. Pada prosesor 32-bit, kata-katanya semua 32 bit, jadi ganda adalah 64 bit. Apa artinya ini dalam hal kinerja adalah bahwa operasi pada angka presisi ganda membutuhkan waktu lebih lama untuk dijalankan. Jadi Anda mendapatkan rentang yang lebih baik, tetapi ada sedikit keberhasilan. Hit ini dimitigasi sedikit oleh unit floating point perangkat keras, tetapi masih ada.

N64 menggunakan MIPS R4300i berbasis NEC VR4300 yang merupakan prosesor 64 bit, tetapi prosesor berkomunikasi dengan seluruh sistem melalui bus lebar 32-bit. Jadi, sebagian besar pengembang menggunakan angka 32 bit karena lebih cepat, dan sebagian besar game pada saat itu tidak membutuhkan ketepatan tambahan (sehingga mereka menggunakan float bukan double).

Ketiga sistem dapat melakukan operasi mengambang presisi tunggal dan ganda, tetapi mereka mungkin bukan karena kinerja. (Meskipun hampir semuanya setelah n64 menggunakan bus 32 bit jadi ...)

Alex
sumber
1

Pertama-tama float dan double digunakan untuk representasi bilangan pecahan. Jadi, perbedaan antara keduanya bermula dari fakta dengan seberapa presisi mereka dapat menyimpan angka.

Sebagai contoh: Saya harus menyimpan 123.456789 Seseorang mungkin dapat menyimpan hanya 123.4567 sementara yang lain mungkin dapat menyimpan 123.456789 yang tepat.

Jadi, pada dasarnya kita ingin tahu seberapa akurat nomor itu dapat disimpan dan apa yang kita sebut presisi.

Mengutip @Alessandro di sini

Presisi menunjukkan jumlah digit desimal yang benar, yaitu tanpa kesalahan representasi atau aproksimasi. Dengan kata lain, ini menunjukkan berapa banyak angka desimal yang dapat digunakan dengan aman.

Float dapat secara akurat menyimpan sekitar 7-8 digit di bagian fraksional sementara Double dapat secara akurat menyimpan sekitar 15-16 digit di bagian fraksional

Jadi, ganda dapat menyimpan dua kali lipat jumlah bagian pecahan seperti float. Itulah mengapa Double dinamakan double the float

djbtalk
sumber
0

Menurut IEEE754 • Standar untuk penyimpanan titik apung • Standar 32 dan 64 bit (presisi tunggal dan presisi ganda) • Masing-masing 8 dan 11 bit eksponen • Format yang diperluas (baik mantissa dan eksponen) untuk hasil antara

Abdullah Al Mamun
sumber
-3

Nomor presisi tunggal menggunakan 32 bit, dengan MSB menjadi bit tanda, sedangkan angka presisi ganda menggunakan 64 bit, MSB menjadi bit tanda

Presisi tunggal

SEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)

Presisi ganda:

SEEEEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)

Steve Bennett
sumber