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.
diğer banklarda ne yapıyor?
bank2 float volt=0;
bank2 float real_volt=0;
yukarıdaki gibi dene mesela...
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 ?
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.
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.
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.
Hocam if döngüsü ile float sayılar karşılaştırılabiliyor mu?
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.
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.
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?
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.
Anladım hocam sağolun. Küsüratlarda sorun olabilir diyorsunuz.
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)
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ş.
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.
Anladım hocam sağolun.
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.
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.
Bu float sayılar benimde çok kafamı karşıtırıyor.Üstadlar bu konuda genel bir yazı yazabilseler çok faydalı olabilir.
#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.