Fix point binary sayilari decimale cevirmek.

Mikro Step

Kıdemli Üye
Katılım
25 Eylül 2022
Mesajlar
3,874
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
5,891
Mesajlar
100,568
Üyeler
2,494
Son üye
yasin533

Son kaynaklar

Son profil mesajları

gruptaki arkadaşlara selamlar. sıteyi bu gün fark ettim. Asansör için 2x7 segment LCD gösterge üretmek istiyorum. acaba bu sayfadaki arkadaşlardan destek alabilirmiyim. LCD nin mantık açılımı ektedir.
deneyci wrote on TA3UIS's profile.
Selam.
Amatör telsiz lisansı nasıl alınıyor?
Lisansı olmayanı forumlarına almıyorlar. :)
Bilgi alamıyoruz.
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Kesici/Spindle hızı hesaplamak için SpreadSheet UDF'leri kullanın, hesap makinesi çok eski kalan bir yöntem :)
Back
Top