Picproje Elektronik Sitesi

DERLEYİCİLER => PIC C => Konuyu başlatan: alikilavuz - 18 Kasım 2011, 14:43:50

Başlık: PIC C float hatası > < karşılaştırma
Gönderen: alikilavuz - 18 Kasım 2011, 14:43:50
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.

Başlık: Ynt: PIC C float hatası > < karşılaştırma
Gönderen: OptimusPrime - 18 Kasım 2011, 16:55:18
diğer banklarda ne yapıyor?

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

yukarıdaki gibi dene mesela...
Başlık: Ynt: PIC C float hatası > < karşılaştırma
Gönderen: Erol YILMAZ - 18 Kasım 2011, 17:19:58
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 ?
Başlık: Ynt: PIC C float hatası > < karşılaştırma
Gönderen: Murat Mert - 18 Kasım 2011, 20:37:04
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.
Başlık: Ynt: PIC C float hatası > < karşılaştırma
Gönderen: alikilavuz - 19 Kasım 2011, 12:44:00
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.

Başlık: Ynt: PIC C float hatası > < karşılaştırma
Gönderen: alikilavuz - 21 Kasım 2011, 15:51:45
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.
Başlık: Ynt: PIC C float hatası > < karşılaştırma
Gönderen: Erhan YILMAZ - 21 Kasım 2011, 20:54:28
Hocam if döngüsü ile float sayılar karşılaştırılabiliyor mu?
Başlık: Ynt: PIC C float hatası > < karşılaştırma
Gönderen: Tagli - 21 Kasım 2011, 21:23:57
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.
Başlık: Ynt: PIC C float hatası > < karşılaştırma
Gönderen: Erol YILMAZ - 21 Kasım 2011, 21:25:21
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.
Başlık: Ynt: PIC C float hatası > < karşılaştırma
Gönderen: Erhan YILMAZ - 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?
Başlık: Ynt: PIC C float hatası > < karşılaştırma
Gönderen: Tagli - 21 Kasım 2011, 22:50:29
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.
Başlık: Ynt: PIC C float hatası > < karşılaştırma
Gönderen: Erhan YILMAZ - 21 Kasım 2011, 23:27:28
Anladım hocam sağolun. Küsüratlarda sorun olabilir diyorsunuz.
Başlık: Ynt: PIC C float hatası > < karşılaştırma
Gönderen: Erol YILMAZ - 21 Kasım 2011, 23:29:07
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?

(http://upload.wikimedia.org/wikipedia/commons/d/d2/Float_example.svg)
Başlık: Ynt: PIC C float hatası > < karşılaştırma
Gönderen: Erhan YILMAZ - 21 Kasım 2011, 23:42:56
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ş.
Başlık: Ynt: PIC C float hatası > < karşılaştırma
Gönderen: Erol YILMAZ - 22 Kasım 2011, 00:12:14
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.
Başlık: Ynt: PIC C float hatası > < karşılaştırma
Gönderen: Erhan YILMAZ - 22 Kasım 2011, 17:16:47
Anladım hocam sağolun.
Başlık: Ynt: PIC C float hatası > < karşılaştırma
Gönderen: Salih - 23 Kasım 2011, 09:40:05
Bende katkıda bulunayım biraz,
İki float sayıyı şu şekilde  karşılaştırabiliriz.

tolerans = 0.00001
(float1 - Float2) < tolerans

Önceden bir tolerans değeri belirlenir. İki float değişken farkı bu toleransdan küçük ise eşit
kabul edilir.
Başlık: Ynt: PIC C float hatası > < karşılaştırma
Gönderen: z - 23 Kasım 2011, 10:07:11

tolerans = 0.00001
|(float1 - Float2)| < tolerans

Önceden bir tolerans değeri belirlenir. İki float değişken farkınin mutlak degeri bu toleransdan küçük ise eşit
kabul edilir.
Başlık: Ynt: PIC C float hatası > < karşılaştırma
Gönderen: kantirici - 23 Kasım 2011, 19:20:00
Bu float sayılar benimde çok kafamı karşıtırıyor.Üstadlar bu konuda genel bir yazı yazabilseler çok faydalı olabilir.
Başlık: Ynt: PIC C float hatası > < karşılaştırma
Gönderen: cicjoe - 23 Kasım 2011, 19:30:30
#include <stdio.h>

int main()
{
   float f = 10.0f;
   int i;
   for (i = 0; i < 20; i++)
   {
      printf("%f\n", f);
      f += 0.1f;
   }
}


10.000000
10.100000
10.200001
10.300001
10.400002
10.500002
10.600002
10.700003
10.800003
10.900003
11.000004
11.100004
11.200005
11.300005
11.400005
11.500006
11.600006
11.700006
11.800007
11.900007
Press any key to continue . . .

3. satira bakilirsa 10.200001 oldugunu goruyoruz. aslinda 10.200000 olmasi gerekirdi.