/*işte sorun burada başlıyor ondalık değşikenine 0.1 ataması gerekirken
0.100004 atanıyor ve bu yüzden yazdıpım program çalışmıyor.Bunu engelemmenin bir yolu varmı ama aynı şekilde şöyle birşey denedim*/
c=25.1-25 /* boyle yapınca c'ye 0.1 atanıyor.Analamadığım bu sayılar değişken olarak yapılınca neden istenilen şekilde atanmadığıdır.*/
sorunu bilen arkadaşlar yazarsa sevinirim...İyi günler...
problem precision fazlaligindan kaynaklaniyor. genel bi problemdir. sayi/1 yerine sayi*1 dene olmadi sayiyi double yap
ondalik=sayi-(int)sayi; belki işe yarar bide itoa,atoi gibi türleri birbirlerine dönüştüren fonksiyonlar var bunların kullanıp floatı integere çevirirsin aynı işlemi yaparsın eğr yukardaki işe yaramazsa.
senin kodun başka bi yerinde sorun vardır..
değişken yapınca da aynı şekilde çalışıyor.. denedim hatta 0.100000 verdi..
quote:
Orjinalden alıntı: bisanthe
ondalik=sayi-(int)sayi; belki işe yarar bide itoa,atoi gibi türleri birbirlerine dönüştüren fonksiyonlar var bunların kullanıp floatı integere çevirirsin aynı işlemi yaparsın eğr yukardaki işe yaramazsa.
Sadece bilgilendirmek icin soyluyorum: itoa ( integer to ascii ) atoi ( ascii to integer ) integer'i float'a, double'a ceviren fonksiyon yok, atmayalim. Olmasina da gerek yok. Direk cast edersiniz.
double dPrecision = 1.00; int iPrecision = ( int ) dPrecision;
gibi.
Onceden ayni sorunu yazdigim cevap aynen soyle idi:
Bildiginiz gibi asagidaki kod looptan cikmaz *** float m = 1; while ( m != 0 ) { System.out.println ( m ); m -= 0.1; } ***
Bu kod ise durumu izah etmeye yetiyor *** float m = 1; while ( m > 0 ) { System.out.println ( m ); m -= 0.1; }
float ve double da tutulus sekillerinden dolayi precisionda kayiplar olabilir (Corg'dan hatirlayin, sign bit, exponent ve fraction) C++ da float icin noktadan sonra 6 basamak, double da ise 15 basamaga kadar kontrol edebiliyorsunuz. Gerisi sapitiyor.
EPSILON diye bir tanim var. EPSILON soyle tanimlanir: Olabilecek en kucuk sayi ki o sayi ile 0 in toplami precision kayiplarina ragmen compare edersen 0 a denk degildir.
EPSILON = 0.000001 mesela a < EPSILON 0 == 0 + a TRUE doner a >= EPSILON 0 == 0 + a FALSE doner
Bu benim tanimdi tabi ;;) Dogru tanim ve biraz meraklilar, ekteki float.h dosyasina bi bakin. Visual Studio'nun icinden aldim ...
EPSILON tanimina gore kod yazarsaniz sorun yasamazsiniz. Mesela float compare yapacaksaniz epsilon'u spec'ten alin, eger belli araliktaysa tamam deyin ;)