Saya sedikit bingung bagaimana menormalisasi angka di C. Saya tahu bahwa jika Anda memiliki nilai biner floating-point 1101.101, maka dinormalisasi menjadi 1.101101 x 23 dengan memindahkan titik desimal 3 posisi ke kiri. Namun, saya tidak yakin bagaimana melakukan ini dalam kode. Jadi jika saya memiliki 10010000 exp 0 dan saya ingin mendapatkan 01001000 exp 1, bidang pecahannya adalah 001 dan hasil akhirnya adalah 010001. Jika saya memiliki bilangan 8 bit dan 2 bit terdepan adalah 00, saya ingin memindahkannya sampai saya Temukan 1, atau jika saya memiliki bit pertama dari 01 maka sudah dinormalisasi. Similary untuk 2 bit terdepan dari 11 saya memindahkannya ke kiri. Jadi jika nomor saya 32 bit, 1 untuk tanda, 8 untuk eksponen, 23 untuk mantissa, apakah saya akan melakukan sesuatu seperti: Dan kemudian beberapa lagi jika pernyataan untuk 2 nomor bit terdepan lainnya (00, 10) saya bukan Yakin apakah kode logika saya benar Seperti yang Anda katakan, Anda perlu mengekstrak tanda itu, mantissa dan eksponen. Diagram di atas diambil dari Wikipedia menunjukkan bagaimana ia diletakkan untuk format floating point presisi yang paling umum, IEEE 754. Untuk mengekstrak setiap bagian kita perlu melakukan ini dalam tiga langkah di bawah ini. Saya tidak memiliki kode C tapi saya akan menunjukkan langkah-langkah yang perlu Anda ambil. Setelah mengekstraksi 3 bagian hanya menempatkannya pada posisi bit yang ditunjukkan pada diagram di atas. Jika nomor unsigned-nya selalu 0. Jika menandatangani kontrak dengan MSB-nya. 2. Eksponen Jika nomor ditandatangani dan negatif Anda perlu membalik semua bit dan menambahkan 1 untuk mengubahnya menjadi positif. Jika tidak, Anda bisa membiarkannya seperti apa adanya. Untuk mengekstrak eksponen kita harus tahu di mana titik biner yang dimaksud. Biarkan posisi titik biner menjadi b (Dalam contoh anda 3). Biarkan bit pertama dari MSB yaitu 1 menjadi p (Dalam contoh Anda 6). Membiarkan eksponen menjadi e. 3. Mantissa Ini akan sama dengan bit dari posisi p-1 sampai bit 0.Bagaimana untuk mewakili 0.148 2 dalam aritmatika floating point yang dinormalisasi dengan format (0.148) (0.00100101111.) 2 Kami menggesernya 3 bit ke kiri untuk membuat Itu dinormalisasi (1.00101111) 2 2. Eksponen 1164 (75) (1001011) 2 dan Mantissa (01001111) 2. Jadi representasi floating point adalah (0100101100101111) 2 (4B2F) Representasi A Tetapi jika kita menyimpan mantissa denormalized ke dalam register 8 bit, maka wont telah menyimpan tiga terakhir 1s dan kemudian mantissa akan dinormalisasi dari (0.00100101) 2 menjadi (1.00101000 ) 2 dengan memasukkan 3 0s, bukan 1s. Representasi akan menjadi seperti saat ini, normalisasi, apakah prosesor memperhitungkan bit mantissa denormalized di luar 8 bit juga Atau hanya mengulurkannya Mana yang benar: A atau B Apakah itu menyimpan mantissa Dalam representasi titik tetap Bagaimana cara kerjanya? Saya mencoba mengubah int ke float kustom, di mana pengguna menentukan jumlah bit yang disediakan untuk exp dan mantissa, tapi saya tidak mengerti bagaimana konversi bekerja. Fungsi saya mengambil nilai int dan dan int exp untuk mewakili bilangan (nilai 2exp) yaitu nilai 12, exp 4, kembali 192. tapi saya tidak mengerti proses yang harus saya lakukan untuk mengubahnya. Saya telah melihat ini selama berhari-hari dan bermain dengan aplikasi web converter IEEE tapi saya tidak mengerti apa proses normalisasi. Seperti saya melihat bahwa langkahnya titik biner dan menyesuaikan eksponen tapi saya tidak tahu apa artinya ini, boleh ada yang memberi saya contoh untuk pergi dari Juga saya tidak mengerti apa bias eksponennya. Satu-satunya info yang saya miliki adalah bahwa Anda hanya menambahkan nomor ke eksponen Anda tapi saya tidak mengerti mengapa. Saya telah mencari Google untuk sebuah contoh yang bisa saya pahami tapi ini tidak masuk akal bagi saya pada Mar 1 15 di 23:31 U2EF1 jadi bagaimana saya tahu berapa kali hal itu perlu digeser? Seperti jika specifices pengguna 4 bit untuk Mantissa, dan nilainya adalah 3, bagaimana saya tahu untuk menggeser 0011 menjadi 1000 Bisakah saya mendapatkan sesuatu seperti mendapatkan powval maksimum (2, ltspecified mant. Bitsgt) -1 lalu ubah nilai (0011) sampai nilai gt maxval, dan Ada counter yang mencatat berapa kali saya melakukan ndash ini Tommy K Mar 1 15 at 23:51 Sebuah bilangan floating point dinormalisasi saat kita memaksa bagian integer dari mantissa menjadi tepat 1 dan membiarkan bagian frekuensinya menjadi apapun yang kita seperti. Misalnya, jika kita mengambil nomor 13.25. Yang 1101,01 dalam biner, 1101 akan menjadi bilangan bulat dan 01 akan menjadi bagian pecahannya. Saya bisa mewakili 13,25 sebagai 1101,01 (20). Tapi ini tidak dinormalisasi karena bagian integernya bukan 1. Namun. Kita diijinkan untuk menggeser mantissa ke kanan satu digit jika kita meningkatkan eksponen dengan 1: Representasi ini 1.10101 (23) adalah bentuk normal dari 13,25. Yang mengatakan, kita tahu bahwa angka floating point yang dinormalisasi akan selalu datang dalam bentuk 1.fffffff (2exp) Demi efisiensi, kita tidak perlu menyimpan bagian integer 1 dalam representasi biner itu sendiri, kita hanya berpura-pura di sana. Jadi jika kita memberikan tipe float custom-made 5 bit untuk mantissa, kita akan tahu bit 10100 benar-benar akan bertahan untuk 1.10100. Berikut adalah contoh mantel 23-bit standar: Sedangkan untuk bias eksponen, mari kita lihat format float 32-bit standar, yang terbagi menjadi 3 bagian: 1 bit tanda, 8 bit eksponen, dan 23 bit mantissa : Eksponen 00000000 dan 11111111 memiliki tujuan khusus (seperti mewakili Inf dan NaN), jadi dengan 8 bit eksponen, kita dapat mewakili 254 eksponen yang berbeda, misalnya 21 sampai 2254. misalnya. Tapi bagaimana kalau kita mau mewakili 2-3. Bagaimana kita mendapatkan eksponen negatif Format memperbaiki masalah ini dengan secara otomatis mengurangkan 127 dari eksponen. Oleh karena itu: 0000 0001 adalah 1 -127 -126 0010 1101 akan menjadi 45 -127 -82 0111 1111 menjadi 127-127 0 1001 0010 akan menjadi 136-127 9 Ini mengubah kisaran eksponen dari 21. 2254 menjadi 2-126. 2127 sehingga kita bisa mewakili eksponen negatif. Proses normalisasi mengubah input menjadi rentang pilih. Binary32 mengharapkan significand (tidak mantissa) berada di kisaran 1.0 lt s lt 2.0 kecuali jika jumlah tersebut memiliki eksponen minimum. Contoh: nilai 12, exp 4 sama dengan nilai 12 (222), exp 4 3 value 1.5, exp 7 Karena yang bersangkutan dan selalu memiliki digit terdepan 1 (kecuali jika bilangan tersebut memiliki eksponen minimum), tidak perlu Simpanlah Dan bukannya menyimpan eksponen sebagai 7. bias 127 ditambahkan padanya. Nilai 1.5 desimal - 1.1000. 000 biner - 0.1000. Pola biner yang tersimpan adalah gabungan tanda, significand dengan 1 bit tersirat dan eksponen bias Bila bias, biner (23 bit in all) exp 7 - bias exp 7 127 - 134 decimal - 10000110 biner Eksponen adalah 0 - nilai minimum, bit tersirat adalah 0 dan jumlah kecil seperti 0,0 dapat disimpan. Bila eksponen bias adalah 255 - nilai maksimum, data yang tersimpan tidak lagi mewakili angka terbatas namun tak terbatas dan tidak-a-angka. Periksa link yang direferensikan untuk lebih jelasnya. Tommy - chux dan eigenchris, bersama dengan yang lain telah memberikan jawaban yang sangat bagus, tapi jika saya melihat komentar Anda dengan benar, Anda mungkin masih berjuang dengan kacang dan bebek tentang bagaimana saya dapat mengambil info ini dan kemudian menggunakan ini Dalam menciptakan representasi float kustom dimana pengguna menentukan jumlah bit untuk eksponen Jangan merasa buruk, jelas lumpur belasan kali Anda melewatinya. Saya pikir saya bisa mengambil menusuk kliring itu. Anda sudah familiar dengan representasi IEEE754-Single-Precision-Floating-Point: Itu tanda bit 1 bit. Eksponen bias 8 bit (dalam notasi 8-bit over-127), dan mantissa 23 bit yang tersisa. Bila Anda mengizinkan pengguna memilih jumlah bit dalam eksponen, Anda harus mengulang notasi eksponen untuk bekerja dengan batas pilihan pengguna yang baru. Apa yang akan berubah itu akan mengubah penanganan tanda tangan - Tidak. Apakah akan mengubah penanganan mantissa - Tidak (Anda masih akan mengubah mantissasignificand ke hidden bit format). Jadi satu-satunya hal yang perlu Anda fokuskan adalah penanganan eksponen. Bagaimana Anda mendekati Recall ini, eksponen 8-bit saat ini ada dalam apa yang disebut notasi berlebih-127 (di mana 127 mewakili nilai terbesar untuk 7 bit yang memungkinkan bias masuk dan dinyatakan dalam batas 8-bit saat ini. Pengguna memilih 6 bit sebagai ukuran eksponen, lalu apa yang Anda harus menyediakan metode serupa untuk memastikan Anda memiliki nomor tetap untuk mewakili notasi baru Anda yang akan bekerja dalam batas pengguna. Ambillah batas pengguna 6 bit, lalu Pilihan untuk nilai eksponen yang tidak bias dapat diadili sebagai 31 (nilai terbesar yang dapat ditunjukkan dalam 5-bit). Untuk itu Anda bisa menerapkan logika yang sama (dengan contoh 13.25 di atas). Representasi biner Anda untuk nomor tersebut adalah 1101.01 Ke mana Anda memindahkan posisi desimal 3 ke kiri untuk mendapatkan 1.10101 yang memberi Anda bias eksponen 3. Dalam kasus eksponen 6-bit Anda, Anda akan menambahkan 3 31 untuk mendapatkan notasi kelebihan-31 Anda untuk eksponen: 100010. kemudian taruh Mantissa dalam format bit tersembunyi (yaitu drop the le Ading 1 dari 1.10101 yang menghasilkan representasi Tommy Precision kustom Anda yang baru: Dengan tanda bit 1 bit. Eksponen bias 6 bit (dalam notasi 6-bit over-31), dan mantissa 25 bit sisanya. Aturan yang sama akan berlaku untuk membalik proses untuk mendapatkan nomor floating point Anda kembali dari notasi di atas. (Hanya menggunakan 31 bukan untuk mengembalikan bias keluar dari eksponen) Semoga ini bisa membantu dengan cara tertentu. Saya tidak melihat banyak hal lain yang dapat Anda lakukan jika Anda benar-benar mengizinkan ukuran eksponen yang dipilih pengguna. Ingat, standar IEEE-754 bukan sesuatu yang bisa ditebak dan banyak penalaran dan pertukaran yang baik masuk ke tata letak eksplo-ekspitur mantra 1-8-23. Namun, menurut saya latihan Anda melakukan pekerjaan yang bagus dengan mengharuskan Anda untuk benar-benar memahami standarnya. Sekarang benar-benar hilang dan tidak dibahas dalam diskusi ini adalah efek apa yang ada pada kisaran angka yang dapat diwakili dalam Custom Precision Floating Point Representasi ini. Saya havent melihatnya, tapi batasan utama tampaknya akan mengurangi MAXMIN yang bisa diwakili. Jawab Mar 2 15 di 10: 53Summary Semua program Java dikompilasi ke dalam file kelas yang berisi bytecode, bahasa mesin mesin virtual Java. Artikel ini membahas tentang bytecode yang mengimplementasikan kemampuan floating-point Java. Kami akan kembali ke angsuran Under Under Hood lainnya. Kolom ini bertujuan untuk memberi para pengembang Java sekilas tentang keindahan tersembunyi di balik program Java mereka yang sedang berjalan. Kolom bulan ini melanjutkan diskusi, dimulai bulan lalu. Dari set instruksi bytecode dari mesin virtual Java (JVM). Artikel ini membahas aritmatika floating-point di JVM, dan mencakup bytecode yang melakukan operasi aritmatika floating-point. Artikel selanjutnya akan membahas anggota keluarga bytecode lainnya. Poin terapung utama JVMs floating-point support mematuhi standar floating-point IEEE-754 1985. Standar ini mendefinisikan format bilangan floating-point 32-bit dan 64-bit dan mendefinisikan operasi pada angka-angka tersebut. Dalam JVM, aritmatika floating-point dilakukan pada pelampung 32-bit dan ganda 64-bit. Untuk setiap bytecode yang melakukan aritmatika pada floats, ada bytecode yang sesuai yang melakukan operasi yang sama pada dua kali lipat. Angka floating-point memiliki empat bagian - tanda, mantissa, radix, dan eksponen. Tanda itu adalah 1 atau -1. Mantisa, selalu angka positif, memegang digit signifikan dari bilangan floating-point. Eksponen menunjukkan kekuatan positif atau negatif dari radix bahwa mantissa dan tanda harus dikalikan dengan. Keempat komponen digabungkan sebagai berikut untuk mendapatkan nilai floating-point: tanda mantissa radix eksponen Angka floating-point memiliki banyak representasi, karena seseorang selalu dapat mengalikan mantissa dengan bilangan floating-point dengan beberapa kekuatan radix dan mengubah eksponennya. Untuk mendapatkan nomor aslinya Sebagai contoh, angka -5 dapat diwakili sama dengan bentuk berikut di radix 10: Untuk setiap nomor floating-point ada satu representasi yang dikatakan normal. Angka floating-point dinormalisasi jika mantissa berada dalam kisaran yang didefinisikan oleh hubungan berikut: 1 radianx lt mantissa lt 1 Radiografi yang dinormalisasi 10 bilangan floating-point memiliki titik desimalnya tepat di sebelah kiri angka nol-nol pertama di Mantissa Representasi floating point yang dinormalisasi dari -5 adalah -1 0,5 10 1. Dengan kata lain, bilangan floating-point dinormalisasi mantissa tidak memiliki digit nol di sebelah kiri titik desimal dan angka nol nol tepat di sebelah kanan. Dari titik desimal Setiap nomor floating-point yang tidak sesuai dengan kategori ini dikatakan denormalized. Perhatikan bahwa angka nol tidak memiliki representasi yang dinormalisasi, karena tidak memiliki digit nol untuk diletakkan tepat di sebelah kanan titik desimal. QuotWhy dinormalisasiquot adalah seruan umum di antara angka nol. Angka floating-point di JVM menggunakan radix dua. Angka floating-point di JVM, oleh karena itu, memiliki bentuk berikut: tanda mantissa 2 eksponen Mantra dari bilangan floating-point di JVM dinyatakan sebagai bilangan biner. Mantissa yang dinormalisasi memiliki titik binernya (basis dua ekuivalen dengan titik desimal) di sebelah kiri angka nol yang paling signifikan. Karena sistem bilangan biner hanya memiliki dua digit - nol dan satu - angka paling signifikan dari mantissa yang dinormalisasi selalu satu. Bit yang paling signifikan dari pelampung atau ganda adalah tanda sedikit. Mantissa menempati 23 bit paling signifikan dari float dan 52 bit paling signifikan dari double. Eksponen, 8 bit dalam pelampung dan 11 bit dalam double, duduk di antara tanda dan mantissa. Format pelampung ditunjukkan di bawah ini. Tanda bit ditunjukkan sebagai s, bit eksponen ditunjukkan sebagai e, dan bit mantissa ditunjukkan sebagai m: Tata letak bit Java float s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm tanda sedikit nol menunjukkan angka positif dan tanda sedikit satu menunjukkan Angka negatif Mantissa selalu diartikan sebagai basis positif - dua angka. Ini bukan nomor dua pelengkap. Jika tanda sedikit adalah satu, nilai floating-point negatif, tapi mantissa masih ditafsirkan sebagai angka positif yang harus dikalikan dengan -1. Bidang eksponen ditafsirkan dengan salah satu dari tiga cara. Eksponen semua menunjukkan jumlah floating-point memiliki salah satu nilai khusus plus atau minus tak terhingga, atau quotnot a numberquot (NaN). NaN adalah hasil operasi tertentu, seperti pembagian nol sampai nol. Sebuah eksponen dari semua angka nol menunjukkan bilangan floating-point denormalized. Eksponen lain menunjukkan angka floating-point yang dinormalisasi. Mantissa mengandung satu presisi ekstra di luar yang tampak pada bit mantissa. Mantra dari pelampung, yang hanya menempati 23 bit, memiliki presisi 24 bit. Mantra mantis ganda, yang menempati 52 bit, memiliki presisi 53 bit. Bit mantissa yang paling signifikan dapat diprediksi, dan karena itu tidak disertakan, karena eksponen bilangan floating-point di JVM menunjukkan apakah nomor tersebut dinormalisasi atau tidak. Jika eksponennya bernilai nol, bilangan floating-point dinormalisasikan dan bit paling signifikan dari mantissa diketahui nol. Jika tidak, bilangan floating-point dinormalisasi dan bit paling signifikan dari mantissa diketahui satu. JVM tidak membuang pengecualian karena operasi floating-point. Nilai khusus, seperti infinity positif dan negatif atau NaN, dikembalikan sebagai hasil operasi yang mencurigakan seperti pembagian dengan nol. Eksponen semua menunjukkan nilai floating-point khusus. Eksponen semua orang dengan mantissa yang bitnya nol menunjukkan tak terhingga. Tanda tak terhingga ditunjukkan dengan tanda sedikit. Eksponen semua orang dengan mantissa lainnya ditafsirkan sebagai quotnot a numberquot (NaN). JVM selalu menghasilkan mantissa yang sama untuk NaN, yang semuanya nol kecuali bit mantissa yang paling signifikan yang muncul dalam nomor tersebut. Nilai ini ditunjukkan untuk pelampung di bawah ini: Nilai pelampung khusus Float bits (tanda eksponen mantissa) 0 10000000 10010010000111111011011 Sebuah eksponen dari semua angka nol menunjukkan mantissa dinormalkan, yang berarti bit terdepan tidak ada adalah nol dan bukan satu. Kekuatan dua dalam kasus ini sama dengan kekuatan terendah dua yang tersedia bagi mantissa yang dinormalisasi. Untuk float, ini adalah -125. Ini berarti bahwa mantenta yang dinormalisasi dikalikan dengan dua yang diangkat ke kekuatan -125 memiliki bidang eksponen 00000001, sementara mantenta dibagi menjadi dua belas dengan kekuatan -125 memiliki bidang eksponen 00000000. Penyisihan bilangan denormalized di bagian bawah Akhir rentang eksponen mendukung arus berlebih. Jika eksponen terendah digunakan untuk mewakili bilangan normal, arus bawah ke nol akan terjadi untuk jumlah yang lebih besar. Dengan kata lain, membiarkan eksponen terendah untuk bilangan denormalized memungkinkan jumlah yang lebih kecil untuk diwakili. Angka denormalized yang lebih kecil memiliki bit presisi yang lebih sedikit daripada angka yang dinormalisasi, namun ini lebih baik mengalami pelemahan nol setelah eksponen mencapai nilai minimum normalnya. Nilai float disorot Float bit (tanda eksponen mantissa) Terkecil positif (non-nol) float 0 00000000 00000000000000000000001 Pelampung negatif terkecil (tidak nol) 1 00000000 00000000000000000000001 Pelampung denormalized terbesar 1 00000000 11111111111111111111111 0 00000000 0000000000000000000000000 Exposed float: A Java float Mengungkapkan sifat dalamnya Applet di bawah ini memungkinkan Anda bermain-main dengan format floating-point. Nilai pelampung ditampilkan dalam beberapa format. Dua format notifikasi ilmiah menunjukkan mantissa dan eksponen di base sepuluh. Sebelum ditampilkan, mantissa sebenarnya dikalikan dengan 2 24. yang menghasilkan bilangan integral, dan eksponen tidak bias dikurangi oleh 24. Baik mantissa dan eksponen integral kemudian dengan mudah dikonversi menjadi basis sepuluh dan ditampilkan. Klik di sini untuk kode sumber Exposed Float.
Comments
Post a Comment