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 :
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..
CCS C de denedim dediğin örneği paylaşırmısınız?
aşağıdaki gibi yaptıysan olmaz ....
int a=2,b=3;
float sonuc;
sonuc = a/b;
Ama aşağıdaki gibi "type casting" ile yaparsan sonuç elde edebilirsin.
int a=2,b=3;
float sonuc;
sonuc = (float)a/b;
float a,b,sonuc;
sonuc=a/b;
ccs de(C dilinde) böyle de sonuç virgüllü çıkar
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..
arkadaşlar peki jal ile yapılmış bi programda küsüratlı sayma işlemi yapabilir miyiz?
Alıntı yapılan: gareven - 07 Mayıs 2012, 13: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..
Alıntı yapılan: 3L3CTRO - 10 Mayıs 2012, 11: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.