Sunday 13 August 2017

Pilihan Terapung Mantissa Eksponen Biner


IEEE Floating-Point Representasi Pada artikel ini Microsoft Visual C konsisten dengan standar numerik IEEE. Ada tiga varietas internal bilangan real. Real4 dan real8 digunakan dalam Visual C. Real4 dinyatakan menggunakan kata float. Real8 dinyatakan menggunakan kata double. Pada pemrograman Windows 32-bit, peta tipe data ganda yang panjang menjadi dua kali lipat. Namun, ada dukungan bahasa assembly untuk perhitungan menggunakan tipe data real10. Nilai-nilainya disimpan sebagai berikut: S mewakili bit tanda, X 39s adalah bit eksponen, dan M 39s adalah bit mantissa. Perhatikan bahwa bit paling kiri diasumsikan dalam format nyata 4 dan nyata 8, namun hadir sebagai kuota dalam format real10 BYTE 3. Untuk menggeser titik biner dengan benar, Anda terlebih dahulu melepaskan eksponen dan kemudian memindahkan titik biner ke kanan atau meninggalkan jumlah bit yang sesuai. Berikut adalah beberapa contoh dalam format real4: Pada contoh berikut, bit tanda nol, dan eksponen yang tersimpan adalah 128, atau 100 0000 0 dalam biner, yaitu 127 plus 1. Mantissa yang tersimpan adalah (1.) 000 0000 0000 0000, yang memiliki titik 1 dan biner terdepan, sehingga mantissa sebenarnya adalah satu. Sama seperti 2 kecuali bit tanda disetel. Hal ini berlaku untuk semua format angka floating-point IEEE. Mantra yang sama, eksponen meningkat satu (nilai bias 129, atau 100 0000 1 dalam biner. Eksponen yang sama, mantissa lebih besar setengahnya (1.) 100 0000. 0000 0000, yang, karena ini adalah pecahan biner, adalah 1 12 (nilai digit pecahan adalah 12, 14, 18, dan seterusnya). Eksponen yang sama dengan kekuatan dua lainnya, mantissa adalah satu kurang dari dua pada 127, atau 011 1111 1 dalam biner. Eksponen yang bias adalah 126, 011 1111 0 dalam biner, dan mantissa adalah (1.) 100 0000. 0000 0000, yaitu 1 12. Sama seperti dua kecuali bahwa bit yang mewakili 14 diatur dalam mantissa 110 adalah pecahan berulang dalam biner Mantissa hanya malu 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 sebenarnya adalah 123 127 4, yang berarti bahwa Faktor yang digunakan untuk melipatgandakan adalah 24 116. Perhatikan bahwa mantissa yang disimpan dibulatkan pada bit terakhir sebagai upaya untuk mewakili bilangan yang tidak dapat diterima seakurat mungkin. (Alasan mengapa 110 dan 1100 tidak tepat representatif dalam biner sama dengan alasan mengapa 13 tidak tepat untuk desimal) 0 1.0 2-128 semua angka nol - kasus khusus.3.10.1. Dasar-dasar Titik mengambang akan Sekitar keterbatasan fixed point dengan menggunakan format yang mirip dengan notasi ilmiah. Nomor notasi ilmiah, seperti yang mungkin Anda ketahui, terdiri dari mantissa (3,52 pada contoh di atas) radix (selalu 10), dan eksponen (3 pada contoh di atas). Oleh karena itu, format umum dari nilai notasi ilmiah adalah: mantissa x radix eksponen Bentuk normal selalu memiliki mantissa yang lebih besar dari atau sama dengan 1,0, dan kurang dari 10,0. Kita dapat menentukan nilai dan mengekspresikannya dengan banyak cara lain, seperti 35,2 x 10 2. atau 0,00325 x 10 0. Untuk setiap posisi, kita menggeser angka mantissa relatif ke titik desimal, kita menambah atau menurunkan nilai dari Mantissa dengan faktor 10. Untuk mengimbangi hal ini, kita hanya meningkatkan atau mengurangi eksponen dengan 1. Denormalizing diperlukan saat menambahkan nilai notasi ilmiah: Menyesuaikan mantissa dan eksponen terkadang juga diperlukan untuk menormalisasi hasil. Sebagai contoh, 9,9 x 10 2 9,9 x 10 2 adalah 19,8 x 10 2. yang harus dinormalisasi menjadi 1,98 x 10 3. Sistem apung biner menyimpan mantissa biner yang ditandatangani dan eksponen biner yang ditandatangani, dan biasanya menggunakan radix 2. Menggunakan radix 2 (atau kekuatan 2) memungkinkan kita untuk menormalkan dan menormalkan dengan menggeser digit biner di mantissa dan menyesuaikan eksponen integer pada radix 2. (Menggeser digit biner dalam bit mantissa ke kiri atau Benar mengalikan atau membagi mantissa dengan 2 n.) 00010 2 x 2 3 01000 2 x 2 1. Format floating point standar didefinisikan oleh masyarakat IEEE. Format IEEE sedikit lebih kompleks sehingga perlu untuk memahami floating point secara umum, jadi kita akan mulai dengan contoh sederhana disini. 3.10.2.A Simple Floating Point Format Misalkan format floating point 32-bit memiliki mantel pelengkap 24 bit mantissa, pelengkap pelengkap dua bit 8 bit, dan radix 2. Struktur umumnya adalah: mantissa x 2 eksponen Dimana Mantissa adalah bilangan bulat komplemen 24-bit, dan eksponennya adalah bilangan bulat pelengkap dua bit. Format binernya adalah sebagai berikut: Table3.3.Floating Point Format Berapakah nilai dari bilangan berikut Mantissa adalah 000000000000000000010010, atau (2 16) 18. Eksponennya adalah 11111100 - (00000011 1) -00000100 -4. Nilai tersebut adalah 18 x 2 -4 Berapakah nilai positif terbesar yang dapat kita wakili dalam sistem ini Nilai positif terbesar akan terdiri dari mantissa positif terbesar dan eksponen positif terbesar. Mantissa terbesar adalah 011111111111111111111111, yang di dua pelengkap adalah 2 23 -1 (8388607). Eksponen terbesar adalah 01111111, yang di dua pelengkap adalah 2 7 -1 (127). Oleh karena itu, nilai positif terbesar adalah 8388607 x 2 127 1,42 x 10 45. Berapakah nilai positif kedua terbesar Apa perbedaan antara terbesar dan kedua terbesar Apa nilai positif terkecil Untuk menemukan nilai positif terkecil dalam bentuk mantissa x Eksponen radix Kita memilih mantissa positif terkecil, dan eksponen negatif terkecil (eksponen negatif dengan besaran terbesar). Karena mantissa adalah bilangan bulat, nilai positif terkecil mungkin adalah 1. Karena eksponennya adalah nilai pelengkap dua bit, eksponen negatif terkecil adalah 10000000 2. Dari -2 7 -128. Makanya nilai positif terkecil adalah 1 x 2 -128. Atau 2.93873587706 x 10 -39. Berapakah nilai positif terkecil kedua Apa perbedaan antara Reparasi terkecil dan terkecil kedua -2.75 dalam sistem floating point ini. Kaitkan bilangan ke biner titik tetap dengan menggunakan metode yang dijelaskan pada bagian sebelumnya: Kalikan dengan eksponen radix sama dengan 1: Shift Titik biner untuk membuat mantissa menjadi bilangan utuh: - (1011 2) Dengan memindahkan titik biner dua tempat ke kanan, kita mengalikan mantissa dengan 2 2. Oleh karena itu kita harus membagi (radix eksponen) dengan faktor yang sama: Mengkonversi Mantissa dan eksponen ke format yang ditentukan (pelengkap dua kali dalam kasus ini): Mantissa: - (00000000000000000000001011) 111111111111111111110101 Exponent: -2 10 11111110 Keterwakilan biner 11111111111111111111010111111110 Berapa banyak nilai yang berbeda yang dapat ditunjukkan sistem ini 3.10.3.Overflow dan Underflow Overflow terjadi saat Hasil operasi floating point lebih besar dari nilai positif terbesar, atau lebih kecil dari nilai negatif terkecil. Dengan kata lain, besarannya terlalu besar untuk diwakili. Underflow terjadi ketika hasil operasi floating point lebih kecil dari nilai positif terkecil, atau lebih besar dari nilai negatif terbesar. Dengan kata lain, besarannya terlalu kecil untuk diwakili. Contoh format 32-bit di atas tidak dapat mewakili nilai lebih besar dari sekitar 10 45 atau lebih kecil dari sekitar 10 -39. Salah satu teknik untuk menghindari overflow dan underflow adalah operasi alternatif yang meningkatkan dan menurunkan hasil antara. Alih-alih melakukan semua perkalian pertama, yang dapat menyebabkan overflow, atau semua divisi pertama, yang dapat menyebabkan underflow, kita dapat menggabungkan multiplications dan division untuk memoderasi hasilnya di sepanjang jalan. Teknik seperti ini harus sering digunakan dalam perhitungan ilmiah yang rumit. 3.10.4.Cost dari Floating Point Semuanya memiliki biaya. Rentang dan kemampuan yang meningkat untuk mewakili bilangan non-keseluruhan tidak terkecuali. Hanya ada 32 pola 32 0s dan 1s. Oleh karena itu, hanya ada 2 32 nomor unik yang bisa kita wakili dalam 32 bit, apapun formatnya. Jadi bagaimana kita bisa mewakili angka sampai 10 45. Tentunya kita harus mengorbankan sesuatu di antaranya. Apa gunanya floating point bagi kita adalah menyebarkan jumlah terbatas pola biner yang kita miliki untuk menjangkau rentang angka yang lebih besar. Semakin besar eksponennya, semakin besar jarak antara angka berurutan yang bisa kita sajikan secara akurat. Dekat dengan 0, kita bisa mewakili banyak angka dalam kisaran kecil. Jauh dari nol, akan ada seluruh jajaran bilangan bulat yang tidak dapat diwakili. Ketepatan nilai floating point 32-bit kurang dari ketepatan bilangan bulat 32-bit. Dengan menggunakan 8 bit untuk eksponen, kita mengorbankan 8 bit presisi tersebut. Oleh karena itu, format contoh kita memiliki ketepatan yang sama seperti sistem integer yang ditandatangani 24 bit. Kinerja Aritmatika pada floating point beberapa kali lebih lambat dari pada bilangan bulat. Ini adalah properti inheren dari format. Perhatikan proses penambahan dua nilai notasi ilmiah. Menyamakan eksponen Menambahkan mantissas Menormalisasi hasilnya Masing-masing operasi ini memakan kira-kira jumlah waktu yang sama di komputer sebagai tambahan bilangan bulat tunggal. Karena floating point disimpan seperti notasi ilmiah, kita bisa mengharapkan penambahan floating point sekitar tiga kali lebih lama dari penambahan integer. Pada kenyataannya, PC biasa membutuhkan waktu sekitar 2,5 kali lebih lama untuk melakukan instruksi aritmatika floating point seperti pada instruksi integer yang sama. Perhatikan bahwa ini hanya berlaku untuk operasi yang dapat dilakukan dengan menggunakan satu instruksi bilangan bulat tunggal atau instruksi floating point tunggal. Misalnya, misalkan sebuah program berjalan pada komputer 32-bit, dan tidak ada cara untuk mewakili data dalam kisaran bilangan bulat 32-bit. Dalam kasus ini, beberapa instruksi integer akan diperlukan untuk memproses nilai integer lebih dari 32 bit, dan keuntungan kecepatan bilangan bulat tidak berlaku. Hal ini juga mungkin terjadi pada beberapa sistem dimana operasi floating point dan integer dapat terjadi pada saat yang bersamaan, dan karenanya memanfaatkan perangkat keras floating point dapat menghasilkan kinerja yang lebih baik daripada melakukan operasi bilangan bulat tambahan sedangkan unit floating point duduk menganggur. Ini adalah kasus dengan rendering grafis yang terjadi dengan menggunakan floating point pada graphics processing unit (GPU) daripada CPU. Tidak masuk akal untuk memindahkan perhitungan rendering ke CPU agar bisa menggunakan bilangan bulat, karena ini hanya akan meningkatkan beban kerja untuk CPU dan membiarkan kekuatan GPU menjadi sia-sia. Jika perangkat keras memiliki dukungan floating point built-in, maka operasi umum seperti penambahan floating point, pengurangan, dll masing-masing dapat ditangani dengan satu instruksi. Jika perangkat keras tidak memiliki unit floating point (umum pada prosesor tersemat), operasi floating point harus ditangani oleh rutinitas perangkat lunak. Oleh karena itu, menambahkan dua nilai floating point akan membutuhkan puluhan instruksi untuk menyelesaikannya, bukan hanya satu. Ini akan ratusan kali lebih lambat dari bilangan bulat, dan akan menghabiskan banyak memori program yang tersedia. Sebagian besar algoritma dapat diimplementasikan menggunakan bilangan bulat dengan sedikit pemikiran. Penggunaan floating point seringkali akibat kemalasan belaka. Jangan gunakan floating point hanya karena intuitifnya. Konsumsi daya lebih banyak. CPU mencapai konsumsi daya maksimal saat melakukan perhitungan floating point intensif. Ini biasanya tidak terlihat pada PC desktop, namun bisa menjadi masalah pada jaringan besar yang terdiri dari ratusan PC, karena jaringan listrik yang terpasang pada mereka mungkin tidak dirancang untuk memberikan hasil maksimal. Ini juga bisa menjadi masalah saat menjalankan laptop dengan baterai sambil melakukan perhitungan intensif. Daya tahan baterai saat melakukan perhitungan floating point secara intensif bisa menjadi bagian kecil dari apa adanya saat membaca email, browsing web, atau mengedit dokumen di OpenOffice. Decimal ke Floating-Point Converter Mengenai Desimal ke Floating-Point Converter Ini adalah desimal Ke konverter floating-point biner. Ini akan mengubah angka desimal ke bilangan presisi terurut tunggal dan presisi ganda IEEE 754 bilangan biner floating-point, menggunakan round-half-to-even rounding (mode pembulatan IEEE default). Hal ini diimplementasikan dengan aritmatika presisi sewenang-wenang, jadi konversinya dibulatkan dengan benar. Ini akan mengubah angka normal dan subnormal, dan akan mengubah angka yang melimpah (tak terhingga) atau underflow (menjadi nol). Angka floating-point yang dihasilkan dapat ditampilkan dalam sepuluh bentuk: dalam desimal, dalam biner, dalam notasi ilmiah desimal yang dinormalisasi, dalam notasi ilmiah biner yang dinormalisasi, sebagai desimal yang dinormalisasi dengan kekuatan dua, sebagai bilangan bulat desimal yang menghasilkan dua , Sebagai bilangan bulat desimal kali kekuatan sepuluh, sebagai heksadesimal floating-point konstan, dalam biner mentah, dan dalam heksadesimal mentah. Setiap bentuk mewakili nilai pasti dari bilangan floating-point. Mengapa Menggunakan Konverter Ini Konverter ini akan menunjukkan mengapa angka dalam program komputer Anda, seperti 0,1, tidak berperilaku seperti yang Anda harapkan. Di dalam komputer, sebagian besar angka dengan titik desimal hanya bisa didekati dengan nomor lain, hanya sedikit dari yang Anda inginkan, harus berdiri untuk itu. Sebagai contoh, dalam presisi tunggal floating-point, 0,1 menjadi 0.100000001490116119384765625. Jika program Anda mencetak 0,1, itu berbohong kepada Anda jika mencetak 0.100000001, it8217 masih berbohong, tapi setidaknya itu berarti Anda benar-benar tidak memiliki 0,1. Cara Menggunakan Konverter Ini Masukkan angka positif atau negatif, baik dalam bentuk standar (misalnya 134.45) atau eksponen (misalnya 1.3445e2). Tunjukkan nilai fraksional dengan titik desimal (lsquo. rsquo), dan jangan gunakan koma. Intinya, Anda bisa memasukkan apa yang diterima program komputer sebagai floating-point literal, kecuali tanpa akhiran (seperti lsquofrsquo). Centang kotak untuk presisi IEEE yang Anda inginkan pilih Double. Satu. atau keduanya. (Double adalah defaultnya.) Double berarti sebuah integer 53 bit (kurang jika subnormal) dengan eksponen 11-bit Tunggal berarti signifikansi 24 bit (kurang jika subnormal) dengan eksponen 8-bit. Centang kotak untuk format output yang Anda inginkan pilih satu atau semua sepuluh. (Desimal adalah defaultnya.) Klik lsquoConvertrsquo untuk berkonversi. Klik lsquoClearrsquo untuk mereset formulir dan mulai dari awal. Jika Anda ingin mengonversi nomor lain, cukup ketik di atas nomor asli dan klik lsquoConvertrsquo 8212 tidak perlu mengklik lsquoClearrsquo terlebih dahulu. Ada sepuluh bentuk output yang bisa dipilih: Desimal. Tampilkan bilangan floating-point dalam desimal. (Perluas kotak output, jika perlu, untuk melihat semua digit.) Biner. Tampilkan bilangan floating-point dalam biner. (Perluas kotak output, jika perlu, untuk melihat semua digit.) Normalized notasi ilmiah desimal. Menampilkan bilangan floating-point dalam desimal, tapi kompak, menggunakan notasi ilmiah yang dinormalisasi. (Perbanyak kotak output, jika perlu, untuk melihat semua digit.) Notasi ilmiah biner yang dinormalisasi. Menampilkan bilangan floating-point dalam biner, tapi kompak, menggunakan notasi ilmiah biner yang dinormalisasi. Catatan . Angka subnormal ditampilkan normal, dengan eksponen aktualnya. Dinormalisasi desimal kali kekuatan dua. Tampilkan bilangan floating-point dalam notasi ilmiah hibrida yang dinormalisasi, karena angka desimal dinormalisasi menghasilkan dua kekuatan. Desimal bilangan bulat kali memiliki kekuatan dua. Menampilkan bilangan floating-point sebagai bilangan bulat desimal kali dengan kekuatan dua. (Representasi biner dari bilangan bulat desimal adalah pola bit dari representasi floating-point, kurang sedikit trailing nol). Bentuk ini paling menarik untuk eksponen negatif, karena mewakili bilangan floating-point sebagai fraksi diad. Desimal bilangan bulat kali kekuatan sepuluh. Menampilkan bilangan floating-point sebagai bilangan bulat desimal kali dengan kekuatan sepuluh. Bentuk ini paling menarik bagi eksponen negatif, karena ini mewakili bilangan floating-point sebagai pecahan. (Perluas kotak output, jika perlu, untuk melihat semua digit.) Konstanta floating-point heksadesimal. Tampilkan bilangan floating-point sebagai heksadesimal floating-point constant. Catatan . Ada banyak cara untuk memformat konstanta floating-point heksadesimal, seperti yang akan Anda lihat jika, misalnya, Anda membandingkan keluaran program Java, Visual C, gcc C, dan Python. Perbedaan di berbagai bahasa bersifat dangkal meskipun 8212 angka nol yang tertinggal mungkin atau mungkin tidak diperlihatkan, eksponen positif mungkin atau mungkin tidak memiliki tanda tambah, dan lain-lain. Konverter ini memformat konstanta tanpa tertinggal nol dan tanpa tanda tambah. Catatan . Seperti banyak bahasa pemrograman, konverter ini menunjukkan angka subnormal yang tidak disadari, dengan eksponennya disetel ke eksponen normal minimum. Catatan . Angka heksadesimal terakhir dalam konstanta floating-point heksadesimal mungkin memiliki trailing biner 0s dalam hal ini tidak berarti menyiratkan bahwa bit tersebut ada dalam format IEEE yang dipilih. Biner mentah Menampilkan bilangan floating-point dalam format IEEE mentah (tanda sedikit diikuti oleh bidang eksponen diikuti oleh bidang significand). Baku heksadesimal. Menampilkan bilangan floating-point dalam format IEEE mentah, setara dengan format biner mentah namun dinyatakan kompak dalam heksadesimal. (Lihat di sini untuk rincian lebih lanjut tentang bentuk keluaran ini.) Ada dua bendera keluaran: Tidak tepat. Jika dicentang, ini menunjukkan bahwa konversi itu tidak tepat, maka harus dibulatkan ke perkiraan jumlah masukan. (Konversi tidak tepat saat output desimal tidak sesuai dengan input desimal, tapi ini adalah cara yang lebih cepat untuk diceritakan.) Catatan. Bendera konverter ini meluap hingga tak terhingga dan terbelakang ke nol sebagai tidak tepat. Subnormal Jika dicentang, ini menunjukkan bahwa jumlahnya terlalu kecil, dan dikonversi dengan presisi kurang (presisi sebenarnya ditunjukkan dalam tanda kurung). Implementasi Saya menulis konverter ini dari awal 8212, hal itu tidak bergantung pada fungsi konversi asli seperti strtod () atau strtof () atau printf (). Hal ini didasarkan pada algoritma berbasis integer besar yang saya gambarkan dalam artikel saya ldquoCorrect Desimal To Floating-Point Menggunakan Big Integer rdquo. Saya menerapkannya dengan BCMath. Untuk alasan praktis, saya menetapkan batas sewenang-wenang (agak) pada panjang input desimal yang akan Anda dapatkan pesan kesalahan jika Anda menekannya. Ini akan menyaring masukan yang jika tidak akan meluap ke tak terhingga atau turun ke nol, namun juga akan mencegah Anda memasuki beberapa kasus pembulatan ldquohardrdquo. (Untuk catatan sekalipun, konverter ini menerima semua contoh keras yang telah saya bahas di situs saya.) Untuk semua masukan yang diterima, hasilnya benar (meskipun ada bug yang lolos dari pengujian ekstensif saya).Decimal Konverter Floating Point Tentang Desimal ke Floating-Point Converter Ini adalah desimal ke biner floating-point converter. Ini akan mengubah angka desimal ke bilangan presisi terurut tunggal dan presisi ganda IEEE 754 bilangan biner floating-point, menggunakan round-half-to-even rounding (mode pembulatan IEEE default). Hal ini diimplementasikan dengan aritmatika presisi sewenang-wenang, jadi konversinya dibulatkan dengan benar. Ini akan mengubah angka normal dan subnormal, dan akan mengubah angka yang melimpah (tak terhingga) atau underflow (menjadi nol). Angka floating-point yang dihasilkan dapat ditampilkan dalam sepuluh bentuk: dalam desimal, dalam biner, dalam notasi ilmiah desimal yang dinormalisasi, dalam notasi ilmiah biner yang dinormalisasi, sebagai desimal yang dinormalisasi dengan kekuatan dua, sebagai bilangan bulat desimal yang menghasilkan dua , Sebagai bilangan bulat desimal kali kekuatan sepuluh, sebagai heksadesimal floating-point konstan, dalam biner mentah, dan dalam heksadesimal mentah. Setiap bentuk mewakili nilai pasti dari bilangan floating-point. Mengapa Menggunakan Konverter Ini Konverter ini akan menunjukkan mengapa angka dalam program komputer Anda, seperti 0,1, tidak berperilaku seperti yang Anda harapkan. Di dalam komputer, sebagian besar angka dengan titik desimal hanya bisa didekati dengan nomor lain, hanya sedikit dari yang Anda inginkan, harus berdiri untuk itu. Sebagai contoh, dalam presisi tunggal floating-point, 0,1 menjadi 0.100000001490116119384765625. Jika program Anda mencetak 0,1, itu berbohong kepada Anda jika mencetak 0.100000001, it8217 masih berbohong, tapi setidaknya itu berarti Anda benar-benar tidak memiliki 0,1. Cara Menggunakan Konverter Ini Masukkan angka positif atau negatif, baik dalam bentuk standar (misalnya 134.45) atau eksponen (misalnya 1.3445e2). Tunjukkan nilai fraksional dengan titik desimal (lsquo. rsquo), dan jangan gunakan koma. Intinya, Anda bisa memasukkan apa yang diterima program komputer sebagai floating-point literal, kecuali tanpa akhiran (seperti lsquofrsquo). Centang kotak untuk presisi IEEE yang Anda inginkan pilih Double. Satu. atau keduanya. (Double adalah defaultnya.) Double berarti sebuah integer 53 bit (kurang jika subnormal) dengan eksponen 11-bit Tunggal berarti signifikansi 24 bit (kurang jika subnormal) dengan eksponen 8-bit. Centang kotak untuk format output yang Anda inginkan pilih satu atau semua sepuluh. (Desimal adalah defaultnya.) Klik lsquoConvertrsquo untuk berkonversi. Klik lsquoClearrsquo untuk mereset formulir dan mulai dari awal. Jika Anda ingin mengonversi nomor lain, cukup ketik di atas nomor asli dan klik lsquoConvertrsquo 8212 tidak perlu mengklik lsquoClearrsquo terlebih dahulu. Ada sepuluh bentuk output yang bisa dipilih: Desimal. Tampilkan bilangan floating-point dalam desimal. (Perluas kotak output, jika perlu, untuk melihat semua digit.) Biner. Tampilkan bilangan floating-point dalam biner. (Perluas kotak output, jika perlu, untuk melihat semua digit.) Normalized notasi ilmiah desimal. Menampilkan bilangan floating-point dalam desimal, tapi kompak, menggunakan notasi ilmiah yang dinormalisasi. (Perbanyak kotak output, jika perlu, untuk melihat semua digit.) Notasi ilmiah biner yang dinormalisasi. Menampilkan bilangan floating-point dalam biner, tapi kompak, menggunakan notasi ilmiah biner yang dinormalisasi. Catatan . Angka subnormal ditampilkan normal, dengan eksponen aktualnya. Dinormalisasi desimal kali kekuatan dua. Tampilkan bilangan floating-point dalam notasi ilmiah hibrida yang dinormalisasi, karena angka desimal dinormalisasi menghasilkan dua kekuatan. Desimal bilangan bulat kali memiliki kekuatan dua. Menampilkan bilangan floating-point sebagai bilangan bulat desimal kali dengan kekuatan dua. (Representasi biner dari bilangan bulat desimal adalah pola bit dari representasi floating-point, kurang sedikit trailing nol). Bentuk ini paling menarik untuk eksponen negatif, karena mewakili bilangan floating-point sebagai fraksi diad. Desimal bilangan bulat kali kekuatan sepuluh. Menampilkan bilangan floating-point sebagai bilangan bulat desimal kali dengan kekuatan sepuluh. Bentuk ini paling menarik bagi eksponen negatif, karena ini mewakili bilangan floating-point sebagai pecahan. (Perluas kotak output, jika perlu, untuk melihat semua digit.) Konstanta floating-point heksadesimal. Tampilkan bilangan floating-point sebagai heksadesimal floating-point constant. Catatan . Ada banyak cara untuk memformat konstanta floating-point heksadesimal, seperti yang akan Anda lihat jika, misalnya, Anda membandingkan keluaran program Java, Visual C, gcc C, dan Python. Perbedaan di berbagai bahasa bersifat dangkal meskipun 8212 angka nol yang tertinggal mungkin atau mungkin tidak diperlihatkan, eksponen positif mungkin atau mungkin tidak memiliki tanda tambah, dan lain-lain. Konverter ini memformat konstanta tanpa tertinggal nol dan tanpa tanda tambah. Catatan . Seperti banyak bahasa pemrograman, konverter ini menunjukkan angka subnormal yang tidak disadari, dengan eksponennya disetel ke eksponen normal minimum. Catatan . Angka heksadesimal terakhir dalam konstanta floating-point heksadesimal mungkin memiliki trailing biner 0s dalam hal ini tidak berarti menyiratkan bahwa bit tersebut ada dalam format IEEE yang dipilih. Biner mentah Menampilkan bilangan floating-point dalam format IEEE mentah (tanda sedikit diikuti oleh bidang eksponen diikuti oleh bidang significand). Baku heksadesimal. Menampilkan bilangan floating-point dalam format IEEE mentah, setara dengan format biner mentah namun dinyatakan kompak dalam heksadesimal. (Lihat di sini untuk rincian lebih lanjut tentang bentuk keluaran ini.) Ada dua bendera keluaran: Tidak tepat. Jika dicentang, ini menunjukkan bahwa konversi itu tidak tepat, maka harus dibulatkan ke perkiraan jumlah masukan. (Konversi tidak tepat saat output desimal tidak sesuai dengan input desimal, tapi ini adalah cara yang lebih cepat untuk diceritakan.) Catatan. Bendera konverter ini meluap hingga tak terhingga dan terbelakang ke nol sebagai tidak tepat. Subnormal Jika dicentang, ini menunjukkan bahwa jumlahnya terlalu kecil, dan dikonversi dengan presisi kurang (presisi sebenarnya ditunjukkan dalam tanda kurung). Implementasi Saya menulis konverter ini dari awal 8212, hal itu tidak bergantung pada fungsi konversi asli seperti strtod () atau strtof () atau printf (). Hal ini didasarkan pada algoritma berbasis integer besar yang saya gambarkan dalam artikel saya ldquoCorrect Desimal To Floating-Point Menggunakan Big Integer rdquo. Saya menerapkannya dengan BCMath. Untuk alasan praktis, saya menetapkan batas sewenang-wenang (agak) pada panjang input desimal yang akan Anda dapatkan pesan kesalahan jika Anda menekannya. Ini akan menyaring masukan yang jika tidak akan meluap ke tak terhingga atau turun ke nol, namun juga akan mencegah Anda memasuki beberapa kasus pembulatan ldquohardrdquo. (Sebagai catatan, konverter ini menerima semua contoh keras yang telah saya bahas di situs saya.) Untuk semua masukan yang diterima, hasilnya benar (walaupun ada bug yang lolos dari pengujian ekstensif saya).

No comments:

Post a Comment