Gönderen Konu: Virgüllü Bölme İşlemi  (Okunma sayısı 2945 defa)

Çevrimdışı 3L3CTRO

  • Kıdemli
  • ****
  • İleti: 297
  • .:: SsEeRrCcAaNn ::.
    • Kişisel Blog
Virgüllü Bölme İşlemi
« : 08 Kasım 2011, 14:59:13 »
Merhaba Arkadaşlar..

Başka bir forumda bir arkadaşın sorusu üzerine günlerce kafamı kurcalayan bir konuya açıklık getirmek istedim. Sorun Şu

Bir a değişkenimiz var ve birde b sabitimiz var. Aynı zamanda a<b olmaktadır.

şimdi ben bir formül gereği a/b yaptığımda derleyici bana 0 sonucunu dönmektedir.(Jalv2 ve CCS C ile denedim)

Ama işlem sonucu virgüllü sayı olarak çıkmaktadır. Oturdum ve Jalv2 dili ile bir fonksiyon yazdım a ve b değişkeni girdiğinizde tam kısmı bir değişkene ondalık kısmı başla bir değişkene aktarmaktadır. Buraya kadar bir problemimiz yok. Ama işlem yaptıkça bazı işlemlerde hata yaptığını gördüm.

Sorun Şu :


a = 2  b = 3  ise tam kısım = 0 ondalık Kısım = 666 olmaktadır.

Ama

a = 2  b = 55  ise tam kısım = 0 ondalık Kısım = 36 olmaktadır.

Lakin ondalık Kısım = 036 olması gerekmektedir.


Sonuçları görmek için proteusta terminal ekranına göndermekteyim. direk sonucu görmek istediğimde bir şekilde yolunu bulurum ama başka bir fonksiyonda tam sayı ve ondalık sayıyı girip işlem yapmak istediğimde sonuç hatalı olacaktır. Nasıl birşey Yapabilirimde sorunu çözebilirim. ?

Yazdığım fonksiyon :

Kod: [Seç]
include 16f877  -- kullanılacak Chip
include print   -- Yazdırma Formatı

-- CİHAZ TANIMLAMALARI--------------------
pragma target OSC HS             -- Yüksek Hızlı Kristal
pragma target clock 20_000_000   -- Kristal Hızı
pragma target WDT  disabled      -- WatchDogTimer Kapalı
pragma target LVP  disabled      -- Düşük güç programalama Kapalı


pragma target  pwrte       enabled  ; PowerUpTimer
pragma target  CP          disabled ; code protection
pragma target  BROWNOUT    enabled


enable_digital_io()              -- dijital giriş çıkışlar etkin


const serial_hw_baudrate = 9_600 -- Seri İletişim Hızı
include serial_hardware          -- Donanımsal Seri İletişim
serial_hw_init()
include format  -- format kütüphanesi
include print

procedure float_div_16(word in bolunen,word in bolen,word out tam_kisim,
                    word out ondalik) is
var word bolunensayi,bolensayi,basamak
var word sonuc[3],bolum
 bolum = 0
 bolunensayi = bolunen
 bolensayi = bolen
 -- tam kısmı alacağız
  while bolensayi <= bolunensayi loop
       bolum = bolum + 1
       bolensayi = bolensayi + bolen
  end loop
   tam_kisim = bolum
-- ondalık kısım yoksa bitir.
   if ((bolunensayi - (bolum*bolen)) == 0 )  then
   ondalik = 0
     else

-- Ondalık Kısmı Hesaplayalım
block
if (bolen > (bolunensayi - (bolum*bolen))) then
 bolunensayi = (bolunensayi - (bolum*bolen)) * 10 end if
       
for 3 using basamak loop

   bolum = 0
   bolensayi = bolen

   while bolensayi <= bolunensayi loop
        bolum = bolum + 1
        bolensayi = bolensayi + bolen
   end loop

   case basamak of
   0: sonuc[0] = bolum*100
   1: sonuc[1] = bolum*10
   2: sonuc[2] = bolum
   end case

   bolunensayi = (bolunensayi - (bolum*bolen))
   
   if (bolensayi > bolunensayi) then bolunensayi = bolunensayi * 10 end if
   
end loop

ondalik = sonuc[0]+sonuc[1]+sonuc[2]
   
end block
end if

end procedure


var word s_Tam
var word s_ondalik

float_div_16(2,55,s_tam,s_ondalik)

print_word_Dec(serial_hw_data,s_tam)
serial_hw_data = ","
print_word_Dec(serial_hw_data,s_ondalik)

Not : Jalv2 dilini bilmiyorum demeyin lütfen azıcık kod yazan biri kodlara bakınca ne yapmak istediğini anlayacaktır.

Teşekkür ederim..
« Son Düzenleme: 08 Kasım 2011, 15:01:10 Gönderen: 3L3CTRO »
Hayat sadece bir araçtır amaca ulaşmak için; Amaç ise Hayata birşeyler Katmaktır Benim için..

Çevrimdışı GreeN

  • Emektar
  • *****
  • İleti: 574
Ynt: Virgüllü Bölme İşlemi
« Yanıtla #1 : 09 Kasım 2011, 06:35:58 »
CCS C de denedim dediğin örneği paylaşırmısınız?


aşağıdaki gibi yaptıysan olmaz ....
Kod: [Seç]
int a=2,b=3;
float sonuc;
sonuc = a/b;

Ama aşağıdaki gibi "type casting" ile yaparsan sonuç elde edebilirsin.

Kod: [Seç]
int a=2,b=3;
float sonuc;
sonuc = (float)a/b;
Terörü Lanetliyoruz.

Çevrimdışı fahri-

  • Emektar
  • *****
  • İleti: 584
Ynt: Virgüllü Bölme İşlemi
« Yanıtla #2 : 09 Kasım 2011, 06:44:00 »
Kod: [Seç]
float a,b,sonuc;

sonuc=a/b;

ccs de(C dilinde) böyle de sonuç virgüllü çıkar

Çevrimdışı 3L3CTRO

  • Kıdemli
  • ****
  • İleti: 297
  • .:: SsEeRrCcAaNn ::.
    • Kişisel Blog
Ynt: Virgüllü Bölme İşlemi
« Yanıtla #3 : 09 Kasım 2011, 07:42:18 »
Kod: [Seç]
int a=2,b=3;
float sonuc;
sonuc = a/b;


Böyle Yapmıştım Arkadaşlar.. O yüzden olmadı demek. Ziyanı Yok jalv2 de virgülden sonra 9 basamak elde edebilen bir fonksiyon yazabildim.  (1/255)*2 işleminin sonucunu 0.007843136 olarak hesaplayabiliyorum.

Teşekkür ederim..

Hayat sadece bir araçtır amaca ulaşmak için; Amaç ise Hayata birşeyler Katmaktır Benim için..

Çevrimdışı gareven

  • Müdavim
  • ***
  • İleti: 70
    • Elektronik Bakkal
Ynt: Virgüllü Bölme İşlemi
« Yanıtla #4 : 08 Mayıs 2012, 03:53:08 »
arkadaşlar peki jal ile yapılmış bi programda küsüratlı sayma işlemi yapabilir miyiz?

Çevrimdışı 3L3CTRO

  • Kıdemli
  • ****
  • İleti: 297
  • .:: SsEeRrCcAaNn ::.
    • Kişisel Blog
Ynt: Virgüllü Bölme İşlemi
« Yanıtla #5 : 11 Mayıs 2012, 01:02:41 »
arkadaşlar peki jal ile yapılmış bi programda küsüratlı sayma işlemi yapabilir miyiz?

Kısa bir örnek vereyim..

1 den başlayarak 10 a kadar 0.1 aralıklarla sayma yapmak istiyoruz diyelim.. o zaman 11,12,13,14,15,16,17,18,19,20......100 olana kadar saydıracağız.. daha sonra ilgili sayıyı 10 a böleceğiz ve sonucu tam kısma yazacağız. araya virgül koyup sonucu 10 la çarpıp ilgili sayıdan çıkartacağız. ve onu ekrana yazdıracağız..

1.5 sayısını yazdıralım..

tam kısım :  15/10 = 1
ondalık kısım : 15-(10*tam kısım) = 5

Tam kısım  virgül  ondalık kısım

1,5

Sanırım mantığı anladın..
Hayat sadece bir araçtır amaca ulaşmak için; Amaç ise Hayata birşeyler Katmaktır Benim için..

Çevrimdışı gareven

  • Müdavim
  • ***
  • İleti: 70
    • Elektronik Bakkal
Ynt: Virgüllü Bölme İşlemi
« Yanıtla #6 : 12 Mayıs 2012, 02:11:57 »
Kısa bir örnek vereyim..

1 den başlayarak 10 a kadar 0.1 aralıklarla sayma yapmak istiyoruz diyelim.. o zaman 11,12,13,14,15,16,17,18,19,20......100 olana kadar saydıracağız.. daha sonra ilgili sayıyı 10 a böleceğiz ve sonucu tam kısma yazacağız. araya virgül koyup sonucu 10 la çarpıp ilgili sayıdan çıkartacağız. ve onu ekrana yazdıracağız..

1.5 sayısını yazdıralım..

tam kısım :  15/10 = 1
ondalık kısım : 15-(10*tam kısım) = 5

Tam kısım  virgül  ondalık kısım

1,5

Sanırım mantığı anladın..

Evet anladım teşekkür ederim.