Fix point binary sayilari decimale cevirmek.

Mikro Step

Kıdemli Üye
Katılım
25 Eylül 2022
Mesajlar
7,088
Binary tam sayilarin BCD karsiligi icin asagidaki linkte bir algoritma vermistik.


Peki fix point formatindaki binary sayilari nasil BCD yapacagiz?

Ornegin 0001.1000 yani 0x18 sayimiz onlu sistemde 1.5 degerine karsi geliyor. (noktanin saginda ve solunda 4 bit var)
 
Cok cok gicik bir problem?

Umarim dusundugumden cok daha pratik bir cozum vardir.

Noktanin solundakilerle ilgili sorunumuz yok. Tam sayi kismini kolayca BCD ye cevirebiliyoruz.

Noktanin sagindaki bitlerin agirliklari sirasiyla

0.5
0.25
0.125
0.0625
0.03125
0.015625
0.0078125
0.00390625
seklinde gidiyor.

Ben rutinlerimi 32.32 formatinda yazdim.
o halde noktadan sonraki 32. bitin agirligi

0.00000000023283064365386962890625 olacak.

En kucuk veride hic bir biti kaybetmemek icin, her bir terimi 10^32 ile carpalim.

50000000000000000000000000000000
25000000000000000000000000000000
12500000000000000000000000000000
06250000000000000000000000000000
03125000000000000000000000000000
...
...
00000000023283064365386962890625

Simdi 32 bit verimizin her bir bitine karsilik gelen bu degerlerle bir tablo olusturalim.

Donusume basliyoruz.

BCD'ye donusturulecek kesirli ikili sayimizin noktadan sonraki ilk bitine bakalim.

1 ise tabloda 1. terimi yazalim.
2. bit bir ise tablodaki ikinci veriyi ilk veriye toplayalim.
Boyle boyle 32. bite kadar degeri 1 olan bitlerin tablodaki karsiligini toplama ekleyelim.

En sonunda buldugumuz binary sayiyi BCD ye cevirelim ve noktanin saginda olacak sekilde display edelim.

Bu teknikle en kucuk veri milyarda bir olacak sekilde sonuclari gosterebilecegim.
 
Son düzenleme:
Noktadan sonra 9 basamak gostermek uzere fonksiyonumu yukaridaki mantikla yazdim.
Bu fonksiyonda 128 bit toplama islemi yapmak zoruna kaldim.

9 basamak gosterebiliyorken BCD degerler tek bir 32 bitlik degiskene sigsin diye noktadan sonraki 9. haneyi geri dondurmedim. Noktadan sonra 8 basamak 100 milyonda 1 demektir ki voltmetre yaptigimizi dusunursek bu basamak 10nV anlamina gelir.

Bu is yukarida tarif ettigim gibi mi yapiliyor yoksa daha basit bir yolu varmi merak ediyorum.
Bu konuda internette bilgi goremedim.
 
Son düzenleme:
BCD bir yöntem mi yoksa sayı sistemi mi?
İkilik sistem ile BCD sisteminin farkı nedir?
 
hexadecimal 0xFF BCD gosterimde 255.
Yani 8 bitlik ikili veri BCD gosterimde 12 bit istiyor.

5 + 5 = 0xA iken bu BCD aritmetikte ya da BCD donusumde 0x10'a donusuyor.
8 bit mikrolarin bazilarinda DAA, DAS Decimal Adjust Addition/Subtraction gibi komut bulunur.
Bu toplama cikartma islemi ardindan olusan degeri Decimale cevirir.

Daha once verigim 3 ekleme (3 ekle kaydir) algoritmasi da zaten burdan geliyor.
Normalde sayi 9'u astiysa buna 6 eklenir. Mesela sonuc 0xA ise 0xA + 0x6 = 0x10'a donusur.


Gene cogu 8 bit mikrolarda low 4 nibble'dan tasma olduysa bu Decimal Cary olarak kullanilir ve bu amacla ikinci bir Cary flagi bulunur.

BCD = Binary Coded Decimal

Yeni Basicler degismistir, eski basicler tum aritmetic islemleri BCD yapar. Bu da hantalliga neden olur.

Biz C vs ile int gibi degiskenler uzerinde binary matematik calisiyoruz.
Fakat ne zaman ki printf("%d",x) gibi bir komut kullaniyoruz o zaman x icindeki binary değer once BCD'ye ardindan da ASCI'ye cevriliyor.
 
Son düzenleme:

Çevrimiçi personel

Forum istatistikleri

Konular
7,915
Mesajlar
130,855
Üyeler
3,172
Son üye
zapkinus

Son kaynaklar

Son profil mesajları

Mutluluğun resmi illa güzel çizilmiş tablo olmak zorunda değil.Bazen basit bir çizgi,doğru bir renk,yada küçük bir detay
Python Geliştirmeye eklediğim yapay zeka sunucusu, yeni başlayanlar için roket etkisi
Bir insanın zeka seviyesinin en kolay tesbiti, sorduğu sorulardır.
yapay zeka interneti yedi bitirdi, arama motoru kullanan, forumlara yazan kaldı mı ?
az bilgili çok meraklı
Back
Top