Virgüllü Bölme İşlemi

Başlatan SercanTEK, 08 Kasım 2011, 03:59:13

SercanTEK

08 Kasım 2011, 03:59:13 Son düzenlenme: 08 Kasım 2011, 04:01:10 3L3CTRO
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 ondalikis
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)) == )  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 bolunensayithen 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..
Hayat sadece bir araçtır amaca ulaşmak için; Amaç ise Hayata birşeyler Katmaktır Benim için.. www.sercanca.com

GreeN

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.

fahri-

Kod Seç
float a,b,sonuc;

sonuc=a/b;


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

SercanTEK

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.. www.sercanca.com

gareven

arkadaşlar peki jal ile yapılmış bi programda küsüratlı sayma işlemi yapabilir miyiz?

SercanTEK

Alıntı yapılan: gareven - 07 Mayıs 2012, 16:53:08
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.. www.sercanca.com

gareven

Alıntı yapılan: 3L3CTRO - 10 Mayıs 2012, 14:02:41
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.