Perhitungan biner untuk aritmatika desimal

Melanjutkan untuk menyelidiki masalah akurasi desimal menggunakan aritmatika biner, yang dimulai pada posting sebelumnya [1,2,3,4], saya dapat mengembangkan algoritma untuk menghitung bilangan real yang disajikan dalam format angka floating-point angka desimal, yang memberikan hasil persis sama seperti jika perhitungan akan dilakukan secara manual.

Algoritma ini menggunakan aritmatika biner, yang diatur oleh standar IEEE754. Untuk menguji operasi algoritma, sebuah program uji dalam C ++ dikembangkan yang mengimplementasikan kalkulator desimal 18-bit.
Karena volume materi melebihi format posting, saya menetapkan poin utama dalam bentuk abstrak. Kami akan menyebut posting ini Tesis Mei :(.

Jadi

Diketahui bahwa


Aritmatika yang akrab bagi pengguna adalah aritmatika desimal.

Ada juga b-ary aritmatika, di mana b adalah basis dari sistem bilangan, mengambil nilai bukan nol [5].

Untuk menampilkan angka pada skala yang berbeda, kami menggunakan notasi angka floating-point dalam bentuk produk mantissa dan beberapa basis basis sewenang-wenang. Ini yang disebut notasi eksponensial.

Jika derajat angka tetap dan mantissa angka adalah bilangan bulat, maka format ini disebut format titik tetap. Kasus khusus dari format titik tetap adalah angka di mana derajatnya nol. Format ini adalah format bilangan bulat.

Jika mantissa adalah bilangan pecahan dalam sistem b-ary dengan bilangan bulat c โ‰  0 dan c <b, maka bilangan demikian disebut dinormalisasi.

Terlepas dari kenyataan bahwa, berdasarkan sifat fisiknya, angka adalah perkiraan, untuk perangkat komputasi ini adalah angka yang tepat dan perangkat harus melakukan operasi pada mereka dengan akurasi yang ditentukan pengguna.

Perhitungan akurat dalam aritmatika berarti memperoleh hasil dengan jumlah digit signifikan yang valid setelah titik [6].

Semua perhitungan di komputer dilakukan dalam bentuk biner. Bagi mereka, basisnya adalah b = 2.

Karena sistem bilangan biner dan desimal tidak dapat dibandingkan, ketika mengubah bilangan real desimal menjadi kode biner, paling sering kita mendapatkan nilai perkiraan setara biner dari angka desimal. Oleh karena itu, ketika menerjemahkan angka desimal ke biner, kesalahan representasi terjadi.

Angka desimal yang memiliki setara biner yang tepat disebut representable.
Angka desimal yang tidak memiliki setara biner yang tepat disebut tidak representatif.

Semua angka desimal bilangan bulat dapat diwakili jika jumlah digit signifikan dalam setara biner mereka tidak melebihi kotak bit area kata mesin di mana mereka ditulis.

Semakin banyak digit biner, ekuivalen biner dari angka yang diwakili, semakin kecil kesalahan presentasi. Ini menjelaskan keinginan untuk terus meningkatkan kapasitas register operasional prosesor.

Setiap angka desimal yang ekuivalen binernya mengandung jumlah digit signifikan yang melebihi kisi bit kata mesin hanya dapat diwakili kira-kira.

Operasi aritmatika, yang menghasilkan hasil dengan melebihi kedalaman bit dari kata mesin mantissa, mengembalikan angka perkiraan.

Angka yang diperkirakan dapat berisi angka benar, ragu, dan salah.
Angka yang salah dalam perhitungan memengaruhi keakuratan dan kadang-kadang dapat menyebabkan hasil yang sepenuhnya salah [3].

Sesuai dengan teori perhitungan perkiraan, untuk mendapatkan hasil yang benar, angka perkiraan dibulatkan untuk mengecualikan angka yang salah [6].

Keakuratan yang diinginkan pengguna, atau dapat diperoleh dalam perhitungan, ditentukan oleh jumlah digit valid yang disediakan algoritma komputasi.

Setiap angka biner dapat dibulatkan ke angka digit biner yang ditentukan, membuang bit tambahan.

Demikian pula, angka desimal apa pun dapat dibulatkan ke jumlah digit desimal yang diperlukan, dengan membuang digit tambahan.

Anda tidak bisa begitu saja membuang digit biner tambahan dalam angka biner untuk membulatkan angka desimal setara dengan angka digit desimal tertentu, karena mengurangi kedalaman bit dari ekuivalen biner dari angka desimal akan meningkatkan jumlah digit tidak valid dalam angka desimalnya.

Setiap bilangan real yang dinyatakan dalam bentuk pecahan desimal dapat dengan tepat direpresentasikan dalam format angka titik-mengambang (TFT), di mana mantissa adalah bilangan bulat. Peserta pameran di NTC akan menunjukkan posisi titik di nomor itu.

Jika angka disajikan dalam format NTC dengan mantissa integer, maka mantissa dan eksponen dari angka ini dapat secara akurat dikonversi ke kode biner.

Baru


Suatu format di mana desimal TNT mantissa diwakili oleh ekuivalen biner dari mantissa integer desimal, dan eksponen adalah ekuivalen biner dari kekuatan 10 (basis b = 10), akan disebut format decimal-binary campuran (SDDF).

Perbedaan antara SDDF dan format TFT biner adalah bahwa eksponen dalam SDDF sama dengan derajat dasar b = 10, sedangkan eksponen format biner TFT sama dengan derajat basis biner b = 2. Dengan demikian, untuk SDDF, nomor tersebut akan disajikan sebagai F=M210edan untuk CNC, dalam standar IEEE754, sebagai F=M22e.

Perbedaan antara SDDF dan format desimal biner (DDF atau BCD) dari CTT adalah bahwa dalam DDF mantissa dan eksponen adalah angka desimal bilangan bulat di mana setiap digit ditulis sebagai byte atau tetrad, sedangkan di SDDF semua angka desimal diekspresikan setara biner integer mereka.

Dengan demikian, bilangan real desimal apa pun dapat direpresentasikan dalam SDDF dengan kode biner hingga N angka desimal yang signifikan.

Semua operasi aritmatika pada CTD desimal di SDDF dilakukan sesuai dengan aturan aritmatika biasa, di mana semua argumen adalah bilangan bulat.

Sebelum setiap operasi aritmatika, angka desimal diwakili dalam format SDDF: [S, M, z, e]. Di mana S-kode tanda nomor (0 atau 1). M adalah bilangan bulat biner yang setara dengan mantissa suatu angka dengan jumlah angka desimal N. Di mana N adalah akurasi perhitungan. z adalah tanda eksponen, e adalah nilai eksponen. Representasi seperti itu adalah representasi desimal yang dinormalisasi.

Misalnya, untuk perhitungan yang akurat hingga N = 7 digit signifikan, angka 123.456 harus dinyatakan sebagai 1234560 * 10 ^ -4.

Mantera desimal minimum untuk N = 7 adalah M = 1.000.000.

Mantra desimal maksimum untuk N = 7 adalah M = 9999999.

Setara biner dari angka 7-bit maksimum 9999999 akan menjadi 100 110 001 001 011 001 111 111. Ini berisi 24 digit biner. Oleh karena itu, register biner 24-bit diperlukan untuk mewakili mantra desimal dalam kisaran dari 1.000.000 hingga 9999999.

Jika dalam kata mesin biner 32-bit, di mana 24 digit ditugaskan untuk mantissa, satu digit ditugaskan untuk tanda angka S, satu digit untuk tanda eksponen z, dan 6 digit untuk eksponen, maka bilangan real desimal dapat diwakili dalam SDF tersebut akurat hingga N = 7 angka desimal yang signifikan. Nilai absolut dari angka-angka ini berkisar dari 1.000.000 * 10 ^ -64 hingga 9999999 * 10 ^ 64.

Setelah setiap operasi aritmatika, mantissa desimal dari angka tersebut harus dinormalisasi dan dibulatkan ke bilangan bulat terdekat. Untuk melakukan ini, ekuivalen biner yang dihasilkan dari mantissa dari bilangan, jika perlu, harus dikalikan atau dibagi dengan ekuivalen biner dari 10 sedemikian rupa sehingga jumlah digit ekuivalen desimal mantissa menjadi sama dengan N. Jumlah yang dihasilkan harus dibulatkan ke bilangan bulat terdekat.

Sebuah contoh

Temukan, hingga N = 7, hasil dari ekspresi (9675.423 * 10 ^ 2-9.675421 * 10 ^ 5) * 10 ^ 6 - 199992
Dihitung secara manual, atau pada kalkulator Windows, ungkapan ini akan sama dengan angka 8.000000
Kami menulis operan dalam bentuk normal:

A=9,675423*10^5= 9675423*10^-1
B= 9675,421*10^2 = 9675421*10^-1
C=1000000 = 1000000*10^0
D = 1999920*10^-1


Dalam SDDF, operan ini akan direpresentasikan sebagai:

A=[0, 9675423,1, 1]
B=[0,9675421,1, 1]
C=[0, 1000000,0, 0]
D=[0, 1999920,1, 1]


Temukan perbedaannya S = AB. Karena eksponen operan A dan B adalah sama, kami menemukan mantra perbedaan mereka:

9675423-9675421=2

Untuk menormalkan mantissa, S harus dikalikan dengan 10 ^ 6, sedangkan eksponen harus dikurangi dengan 6. Kemudian S = 2 * 1.000.000 = 2.000.000 * 10 ^ -7

Kami menghitung produk P = D * C. Untuk melakukan ini, gandakan mantissa dari faktor-faktor dan tambahkan eksponensial:

M = 2.000.000 * 10 ^ -7 * 1.000.000 * 10 * 0 = 2.000.000.000.000 * 10 ^ -7
Setelah menormalkan mantissa, kita mendapatkan P = 2.000.000 * 10 ^ -1.
Hasil perhitungan R akan sama dengan:
R = PD = 2.000.000 * 10 ^ -1-1999920 * 10 ^ -1 = 80 * 10 ^ -1
Setelah normalisasi, kita mendapatkan R = 8000000 * 10 ^ -6.

Sebagai perbandingan, menghitung ekspresi ini di Excel memberikan hasil R = 8,0000698E + 00.

Penulis telah mengembangkan algoritma kalkulator di SDDF yang melakukan penambahan, pengurangan, perkalian, dan pembagian angka desimal hingga 18 digit signifikan. Untuk mengkonfirmasi kebenaran algoritma, sebuah program C ++ ditulis. Karena penulis bukan programmer profesional, program yang dikembangkan hanya ditujukan untuk studi algoritma perhitungan.

Sebagai contoh, di bawah ini adalah tangkapan layar yang menunjukkan perhitungan ekspresi berikut:

1,23456789098765432*10^8 * 9,87654321234567891*10^(-9) - 1,2193263123914037*10^0โ‰ˆ 3.0*10^(-17)



Untuk menguji kinerja, operasi mengalikan dua angka 18-bit diluncurkan dalam satu siklus. Program ini dijalankan pada komputer Intelยฎ Core (TM) i3-4330 CPU@3.50GHz 3.50 GHz. RAM 8.0 GB. Jenis Sistem: 64-bit Kecepatannya sama dengan lic 2.4 * 10 ^ 6 perkalian per detik.

Saya tidak bisa membandingkan dengan kecepatan kalkulator Windows dan Excel sejauh ini, tidak ada pendidikan yang cukup :(. Adapun keakuratan perhitungannya, sama dengan jika perhitungan dilakukan secara manual.

Referensi:

  1. Tampak samping: standar IEEE754
  2. Apakah normalisasi float diperlukan?
  3. Kesalahan aritmatika biner fatal saat bekerja dengan angka floating point
  4. Lagi tentang angka floating point
  5. Sistem bilangan
  6. Aturan dasar untuk perkiraan perhitungan

Source: https://habr.com/ru/post/id412681/


All Articles