Şimdi Ara

C'den float ile ilgili bir soru??*

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir (1 Mobil) - 1 Masaüstü1 Mobil
5 sn
7
Cevap
0
Favori
950
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • 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...



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

    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/




  • quote:

    Orjinalden alıntı: script




    Bu dans eden elemanlar ne demek?
  • Yapay Zeka’dan İlgili Konular
    C++ Basit Bir Soru
    12 yıl önce açıldı
    Toplam sembolü ile ilgili 3 soru.
    11 yıl önce açıldı
    Daha Fazla Göster
    
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.