C virgülden sonraki kısmın kaç basamaklı olduğunu nasıl bulunur?

KOUsoftware

Hectopat
Katılım
1 Nisan 2020
Mesajlar
157
Yer
İstanbul
Daha fazla  
Cinsiyet
Erkek
Meslek
Öğrenci
C programlamada 0-1 arasında herhangi bir sayının virgülden sonraki kısmının kaç basamaklı olduğunu matematiksel olarak nasıl hesaplatabilirim?
 
Aklıma gelen en basit algoritmayı yazdım,
C:
#include <stdio.h>

int main() {
    int basamak = 0;
    float deger = 0.045; // input alabilirsin

    while (1) {
        deger *= 10;
        if (deger >= 1) {
            printf("Basamak: %d\n", basamak);
            break;
        }
        else {
            basamak++;
        }
    }

    return 0;
}
 
Çoğu yerde IEEE 754 kullanıldığı için tam olarak bulması sakat. Input alacaksanız string olarak alıp sayın. Diğer türlü gerçekten tam anlamıyla çalışanını yapmanız için uğraşırsınız. İnternette arasanız bile tam olarak güzel vereni asla bulamamanız gerekiyor. String alıp ihtiyacınız olduğu kadarına yuvarlayın.
 
Aklıma gelen en basit algoritmayı yazdım,
C:
#include <stdio.h>

int main() {
    int basamak = 0;
    float deger = 0.045; // input alabilirsin

    while (1) {
        deger *= 10;
        if (deger >= 1) {
            printf("Basamak: %d\n", basamak);
            break;
        }
        else {
            basamak++;
        }
    }

    return 0;
}
Degeri kullanıcıdan aldım ve yanlış basıyor basamağı.
 
Çoğu yerde IEEE 754 kullanıldığı için tam olarak bulması sakat. Input alacaksanız string olarak alıp sayın. Diğer türlü gerçekten tam anlamıyla çalışanını yapmanız için uğraşırsınız. İnternette arasanız bile tam olarak güzel vereni asla bulamamanız gerekiyor. String alıp ihtiyacınız olduğu kadarına yuvarlayın.
Bizden float almamız isteniyor. Stringi tanımlarken bu floatı atayabilr miyiz?

Değerin "sıfır virgül" formatında olması lazım. Öyle belirtmissiniz sorunuzda

Evet o şekilde denedim.
 
Saçma hocaların saçma istekleri. Bir şeyi de düzgün isteseler şaşacağım. Hocanıza olmayan bir şey istediğini söyleyin.

Üstün çözümünüzü bulduğunuzda (umarım string kullanmak varken round kullanmak gibi cinslikler yapmadan dahice bir şey bulursunuz) şu koddaki şekilde input alıp 37.78 girdisini verip virgülden sonra 2 basamak olduğunu bulursunuz.

Kod:
#include <stdio.h>

int main() {
    float num = 0.0f;
    printf("sayi gir: ");
    scanf("%f", &num); // 0.0021753 // 0.000488281220893
    printf("%.15f\n", num);
    return 0;
}
 
Uzun zamandır c yazmadım ancak c de fractional taraf her zaman 6 haneli ve kullanılmayan hanelerde sıfır var diye hatırlıyorum. Dolayısı ile @Vavien. in dediği gibi soru saçma cevap her zaman 6 olmalı . Bu durumda sanırım hocanızın istediği float'ı string'e dönüştürüp string'in sonundan başına doğru sıfır dışında rakam görünceye kadar silmek. Ve Sonra noktadan sonraki basamak sayısını saymak.
 
Yanlış hatırlıyorsunuz. Varsayılan altı. Yuvarlamasını yapıyor.
İstenildiğinde IEE 754 izin verdiği sürece gider.

Inputu string olarak almazsa float'u string'e çevirirken benim kullandığım %.15f tarzı format istenecek. Amaç her türlü konsola yazdırmak olduğu için gereksiz. Bir dosyaya yazma falan olsa kullanılabilirdi ama dediğim gibi precision size bağlı. %f yazmak ile %.6f yazmak tamamen aynı şey. Varsayılanı 6.

0.0021753 sayısı 0.0021752999164164066314697265625 olarak tutuluyor bellekte. Sonunda sıfır yok. Buradan sonra precision gidiyor zaten. %.31f yazarsanız bunu alırsınız. Daha büyük sayıda ise sonuna sıfır koyar. Hem de istediğiniz kadar. Daha doğrusu başkaları buna engel olana kadar.

0.0021753 yazdığınızda bellekte tutulan değer aslında bu sayının IEEE 754 hali: 0.00217529991642. Daha doğrusu bellekte tutulanı onluk tabana çevirdiğimizde o sayı çıkıyor. Binary buna müsade etmediği için yakınsıyor.

Kontrol etmedim, yakınsamayı tam nasıl yapıyor bilmiyorum ama 0.00217529991642 ile 0.0021753 arasındaki tüm sayılar için aynı sonucu vermeli bu kod. Yani ilk sayının son 4 basamağıyla istediğiniz gibi oynayabilirsiniz. Sıfır yazmak dahil.

Kod:
#include <stdio.h>

int main() {
    float num = 0.0021753f;
    float num2 = 0.00217529991642f;
    printf("%.31f\n", num);
    printf("%.31f\n", num2);
    return 0;
}
 
Son düzenleme:

Geri
Yukarı