PIC C float hatası > < karşılaştırma

Başlatan alikilavuz, 18 Kasım 2011, 14:43:50

alikilavuz

Merhaba ,

PIC16F877 ile bir proje üzerinde çalışmaktayım

Kodum şu şekilde :

bank1 float volt=0;         // bank 0 da yer kalmadığı için bank 1 de tanımlanıyor
bank1 float real_volt=0;
...
...
...

if((volt*275.0)>real_volt)      // bu  karşılaştırmada hata vermiyor derleyici
    CH_LEVEL++;   
    
if((volt*275.0)<real_volt)      
    CH_LEVEL--;                        // bu karşılaştırmayı yaptığımda ise derleyici  "Error[000]   : Can't find 0x1 words (0x1 withtotal) for psect intsave in
segment BANK0" hatası veriyor. Araya bir else koyunca hata gidiyor ama sebebini merak ettim.

Acaba sebebi nedir?

Şimdiden teşekkür eder, saygılar sunarım.


OptimusPrime

diğer banklarda ne yapıyor?

bank2 float volt=0;       
bank2 float real_volt=0;

yukarıdaki gibi dene mesela...
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

Erol YILMAZ

#2
if((volt*275.0)>real_volt)   CH_LEVEL++;   
if((volt*275.0)<real_volt)   CH_LEVEL--; 


yerine

compvolt = volt*275;
if(compvolt > real_volt)   CH_LEVEL++;   
if(compvolt < real_volt)   CH_LEVEL--; 

  denermisin ?

Murat Mert

S.A.
Aynı işlemi 2 defa yaptırıp birde kaşılaştırma yapınca zaman ve hız olarakta pici kasarsın.
mert07

alikilavuz

Merhaba,

compvolt = volt*275;
if(compvolt > real_volt)   CH_LEVEL++;   
if(compvolt < real_volt)   CH_LEVEL--;

kodunu deneyeceğim. Neticeyi bildiririm. Çok Teşekkürler.


alikilavuz

compvolt = volt*275;
if(compvolt > real_volt)   CH_LEVEL++;   
if(compvolt < real_volt)   CH_LEVEL--;

şeklinde  deneyince hata vermedi.

Çok teşekkür eder,saygılar sunarım.

Erhan YILMAZ

Hocam if döngüsü ile float sayılar karşılaştırılabiliyor mu?

Tagli

tamirci_erhan, elbette tam olmayan sayılar da birbirleyirle karşılaştırılabilirler. Ancak bu işlemin tamsayı karşılaştırmaya göre daha fazla zaman alacağı unutulmamalı. Bu arada, if komutları için döngü ifadesini kullanmak yanlış olur.

alikilavuz, değişkenlerin bank atamalarını sen yapmayıp bu işi derleyiciye bırakırsan yine aynı hataları alıyor musun? Demek istediğim, sen sadece veri bloğunu tanımla ve onun hangi banka yerleşeceğine derleyici karar versin.

Her ne kadar arkadaşlar soruna bir çözüm getirmiş olsa da ben bu sorunun arkasındaki gerçek nedeni anlayamadım ve merakım sürüyor.
Gökçe Tağlıoğlu

Erol YILMAZ

elbette karşılaştırılabilir.
yalnız float sayılarda eşitlik kontrolü yapılmaması gerekiyor....

Bu float sayıların ifade ediliş durumundan kaynaklanıyor.

Erhan YILMAZ

Büyük küçük karşılaştırması yapalım ama eşit mi diye karşılaştırmayalım mı? Neden hocam anlamadım?

Tagli

Mantıken eşit olmaları gerektiği halde işlemin doğasından gelen hesaplama hataları yüzünden bilgisayar tarafından eşit olarak algılanmayabilirler. Örneğin, 1.000000 + 1.0000000 = 2.000000001 olabilir, o da 2.0'a eşit olmaz gibi. Bunu kafadan attım tabi ama bunun gibi garip şeyler olabilir.

Bu sebeple döngü sayacı olarak tam sayıların kullanılması usüldendir. Bazı derleyiciler aksine izin vermez zaten.
Gökçe Tağlıoğlu

Erhan YILMAZ

Anladım hocam sağolun. Küsüratlarda sorun olabilir diyorsunuz.

Erol YILMAZ

Alıntı yapılan: tamirci_erhan - 21 Kasım 2011, 22:36:37
Büyük küçük karşılaştırması yapalım ama eşit mi diye karşılaştırmayalım mı? Neden hocam anlamadım?

Çünkü, genellikle float sayıları tam olarak ifade edemiyoruz.

Neden ifade edemiyoruz?


Erhan YILMAZ

Hocam IEEE754'ten haberim var ama ben eşitlik söz konusu olunca 32 bit float 2 sayı bit bit karşılaştırıp eşit olup olmadığı anlaşılır diye düşünmüştüm. Demek ki işler öyle yürümüyormuş.

Erol YILMAZ

Bu durumu anlamak için float sayılarla işlem yaptırıp float sayıyı aşağı yada yukarı yuvarlamadan
ham olarak lcd ekrana çıktı alman gerekiyor...
f = 5.0 dediğinde bunun 5.0000 değil, 4.9999997 old. göreceksin.