Arama butonu
Bu konudaki kullanıcılar: 1 misafir
6
Cevap
952
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...

DH forumlarında vakit geçirmekten keyif alıyor gibisin ancak giriş yapmadığını görüyoruz.

Üye olduğunda özel mesaj gönderebilir, beğendiğin konuları favorilerine ekleyip takibe alabilir ve daha önce gezdiğin konulara hızlıca erişebilirsin.

Üye Ol Şimdi Değil



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