Arama butonu
Bu konudaki kullanıcılar: 1 misafir, 1 mobil kullanıcı
6
Cevap
950
Tıklama
0
Öne Çıkarma
C'den float ile ilgili bir soru??*
W
20 yıl
Onbaşı
Konu Sahibi

Merhaba arkadaşlar bir program yazarken ondalıklı bir sayını sadece ondalıklı kısmını elde etmeye çalıştım.

örneğin

float ondalık,sayi;

int tam; /*tipinde değişkenler tanımladım*/

/*işlem olarak*/

tam=sayi/1; /* buradaki sayi farzedelim 25.1 olsun*/

ondalık=sayi-tam;

/*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...



O
20 yıl
Çavuş

problem precision fazlaligindan kaynaklaniyor. genel bi problemdir.
sayi/1 yerine sayi*1 dene
olmadi sayiyi double yap


Bu mesaja 1 cevap geldi.
B
20 yıl
Teğmen

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.


Bu mesaja 2 cevap geldi.
D
20 yıl
Yüzbaşı

senin kodun başka bi yerinde sorun vardır..

değişken yapınca da aynı şekilde çalışıyor.. denedim hatta 0.100000 verdi..



R
20 yıl
Çavuş

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;
}

1.0
0.9
0.79999995
0.6999999
0.5999999
0.4999999
0.39999992
0.29999992
0.19999993
0.09999993
***


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 ;)

***

Bu adres yararli olabilir:

IEEE standard 754 for binary floating-point arithmetic
http://cch.loria.fr/documentation/IEEE754/


Bu mesaja 1 cevap geldi.
S
20 yıl
Yüzbaşı

R
20 yıl
Çavuş

quote:

Orjinalden alıntı: script




Bu dans eden elemanlar ne demek?



DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.