Titik tetap vs angka titik mengambang

109

Saya hanya tidak dapat memahami angka fixed point dan floating point karena definisi yang sulit dibaca tentang mereka di seluruh Google. Tetapi tidak ada yang telah saya baca memberikan penjelasan yang cukup sederhana tentang apa itu sebenarnya. Bisakah saya mendapatkan definisi yang jelas dengan contoh?

pengguna942451
sumber
Saya juga kesulitan menemukan definisi yang baik. Hal utama yang saya cari adalah sesuatu untuk membantu saya memahami hasil ini: 3.11 + 42.0 = 45.110001 (bukan 45.11), 3.12 + 42.0 = 45.119999 (bukan 45.12), 3.15 + 42.0 = 45.150002 (bukan 45.15).
Bart S.
1
Saya pikir ini adalah diskusi yang relevan (terutama menjelaskan jebakan dengan bilangan mengambang dan presisi yang lebih baik dengan titik tetap dan mengapa Anda tidak ingin menganggap uang sebagai pelampung. Stackoverflow.com/questions/6320209/…
Andrew Norman
Tautan acak di mana topik disebutkan "OpenGL® ES OpenGL ES menyertakan profil untuk sistem titik-mengambang dan titik tetap dan spesifikasi EGL ™ ..."
The Red Pea

Jawaban:

145

Bilangan titik tetap memiliki jumlah bit (atau digit) tertentu yang disediakan untuk bagian integer (bagian di sebelah kiri koma desimal) dan sejumlah bit tertentu yang disediakan untuk bagian pecahan (bagian di sebelah kanan desimal titik). Tidak peduli seberapa besar atau kecil nomor Anda, itu akan selalu menggunakan jumlah bit yang sama untuk setiap bagian. Misalnya, jika format titik tetap Anda dalam desimal IIIII.FFFFFmaka angka terbesar yang dapat Anda wakili adalah 99999.99999dan angka bukan nol terkecil adalah 00000.00001. Setiap bit kode yang memproses angka-angka tersebut harus memiliki pengetahuan bawaan tentang di mana titik desimalnya.

Bilangan floating point tidak mencadangkan sejumlah bit tertentu untuk bagian integer atau bagian pecahan. Sebaliknya ia menyimpan sejumlah bit untuk nomor tersebut (disebut mantissa atau signifikan ) dan sejumlah bit untuk mengatakan di mana dalam bilangan itu tempat desimal berada (disebut eksponen ). Jadi bilangan floating point yang mengambil 10 digit dengan 2 digit yang disediakan untuk eksponen mungkin mewakili nilai terbesar 9.9999999e+50dan nilai bukan nol terkecil 0.0000001e-49.

Gabe
sumber
8
Anda lupa bahwa angka floating point hampir selalu ditandatangani, jadi nilai minimumnya benar-benar -9.9999999e+50.
Brian Gordon
4
Juga terdapat bias eksponen sehingga Anda dapat merepresentasikan lebih banyak nilai diskrit antara 0 dan 1 daripada yang dapat Anda lakukan antara 1.000.000 dan 1.000.001. Dan ada banyak komplikasi dengan operasi floating point yang muncul, seperti memastikan Anda tidak melaporkan 0 sebagai perbedaan antara dua angka yang sangat mirip ketika bias tidak cukup untuk meningkatkan presisi.
Brian Gordon
28
@ BrianGordon: Saya tidak lupa sedikit tanda; Sengaja saya abaikan agar memiliki gambaran yang sederhana dan tidak perlu mengkhawatirkan perbedaan antara minimum / maksimum dan terkecil / terbesar. Saya juga sengaja meninggalkan bias eksponen (yang tidak ada hubungannya dengan jumlah nilai diskrit antara dua angka), NaN, infinitas, normalisasi, aliran bertahap, nol bertanda, fakta bahwa kebanyakan float adalah biner (yang memungkinkan bit pertama dari mantissa yang harus ditinggalkan), dan sejumlah aspek lain yang tidak diperlukan untuk menggambarkan konsep tersebut.
Gabe
2
Mengapa cutoff untuk jumlah minimum fixed-point 00000.00001? Saya mengharapkan untuk melihat 00000.00000sebagai gantinya. Juga, apakah Anda memiliki referensi yang menjelaskan lebih detail tentang bilangan fixed-point?
Nicholas Miller
4
@ NickMiller: Maaf atas kebingungannya, tapi saya berbicara tentang angka bukan nol. Format contoh saya dapat mewakili 0, 0.00001, 0.00002, ..., 99999.99998, 99999.99999.
Gabe
31

Bilangan tetap berarti ada sejumlah digit tetap setelah koma desimal. Bilangan floating point memungkinkan jumlah digit yang bervariasi setelah koma desimal.

Misalnya, jika Anda memiliki cara menyimpan angka yang membutuhkan tepat empat digit setelah koma, maka itu adalah titik tetap. Tanpa batasan itu, itu adalah floating point.

Seringkali, ketika titik tetap digunakan, pemrogram sebenarnya menggunakan bilangan bulat dan kemudian membuat asumsi bahwa beberapa digit berada di luar koma desimal. Misalnya, saya mungkin ingin menjaga dua digit presisi, jadi nilai 100 berarti sebenarnya 1,00, 101 berarti 1,01, 12345 berarti 123,45, dll.

Bilangan floating point lebih bersifat umum karena dapat mewakili bilangan yang sangat kecil atau sangat besar dengan cara yang sama, tetapi ada hukuman kecil karena harus memiliki penyimpanan ekstra untuk tempat desimal berada.

Vaughn Cato
sumber
2
penggunaan floating point menjadi masalah ketika Anda mulai melakukan perhitungan dengan mereka seperti misalnya jika Anda menambahkan angka floating point yang sangat kecil dan sangat besar secara bersamaan. Hasil yang dijumlahkan kehilangan keakuratan karena harus mewakili angka dengan dua titik ekstrem dan desimal yang lebih rendah akan dipotong (dan tidak dibulatkan).
Andrew Norman
2
juga potensi penggunaan nilai eksponen dalam floating point dapat menyebabkan masalah dengan sistem komputer yang mengharapkan angka standar
Andrew Norman
5

Dari pemahaman saya, aritmatika titik tetap dilakukan dengan menggunakan bilangan bulat. di mana bagian desimal disimpan dalam jumlah bit tetap, atau jumlahnya dikalikan dengan berapa digit ketepatan desimal yang dibutuhkan.

Misalnya, jika angka 12.34perlu disimpan dan kita hanya membutuhkan dua digit ketepatan setelah koma, angka tersebut dikalikan dengan 100untuk mendapatkan 1234. Saat melakukan matematika pada angka ini, kami akan menggunakan kumpulan aturan ini. Menambahkan 5620atau 56.20ke nomor ini akan menghasilkan 6854data atau 68.54.

Jika kita ingin menghitung bagian desimal dari bilangan fixed-point, kita menggunakan operand modulo (%).

12.34 (kodesemu):

v1 = 1234 / 100 // get the whole number
v2 = 1234 % 100 // get the decimal number (100ths of a whole).
print v1 + "." + v2 // "12.34"

Angka floating point adalah cerita yang sama sekali berbeda dalam pemrograman. Standar saat ini untuk bilangan floating point menggunakan sesuatu seperti 23 bit untuk data bilangan tersebut, 8 bit untuk eksponen, dan 1 tetapi untuk tanda. Lihat tautan Wikipedia ini untuk informasi lebih lanjut tentang ini.

Tn. Goober
sumber
3

Istilah 'titik tetap' mengacu pada cara yang sesuai di mana bilangan direpresentasikan, dengan jumlah digit tetap setelah, dan kadang-kadang sebelum, titik desimal. Dengan representasi titik mengambang, penempatan titik desimal dapat 'mengambang' relatif terhadap digit angka yang signifikan. Misalnya, representasi titik tetap dengan konvensi penempatan titik desimal yang seragam dapat mewakili angka 123.45, 1234.56, 12345.67, dll., Sedangkan representasi floating-point juga dapat mewakili 1.234567, 123456.7, 0.00001234567, 1234567000000000, dll.

pengguna3553000
sumber
-6

Ambil nomor 123.456789

  • Sebagai bilangan bulat, angka ini akan menjadi 123
  • Sebagai titik tetap (2), angka ini adalah 123,46 (Dengan asumsi Anda membulatkannya)
  • Sebagai titik mengambang, angka ini akan menjadi 123,456789

Titik mengambang memungkinkan Anda mewakili sebagian besar setiap angka dengan presisi tinggi. Memperbaiki kurang tepat, tetapi lebih sederhana untuk komputer ..

Sparky
sumber
11
Ketepatan dalam menulis angka tidak terkait dengan apakah itu ditulis dalam floating point, integer atau fixed point. Ini terkait dengan jumlah digit signifikan yang Anda miliki. Sebagai contoh, INT_MAX adalah angka yang dapat direpresentasikan secara tepat sebagai int, tetapi tidak sebagai float karena tidak memiliki presisi 31 bit yang diperlukan untuk mewakilinya secara tepat.
Kian
1
fixed adalah yang paling tepat selama ukurannya untuk menangani nomor tersebut. Saat Anda melakukan matematika dengan bilangan titik tetap, pembulatan terjadi jika sisa penghitungan melebihi batas desimal. Dengan floating point Anda bisa mendapatkan nilai yang sangat tidak akurat jika Anda menambahkan angka yang sangat kecil dengan yang sangat besar. Ketika itu terjadi, angka hilang tanpa pembulatan
Andrew Norman
Ini menyesatkan dan salah. Titik tetap berarti jumlah digit setelah koma desimal tetap. Ia tidak mengatakan apa-apa tentang seberapa presisi yang dimilikinya.
Oscar Smith