Şimdi Ara

c de math.h kullanmadan kök alma

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
3 Misafir - 3 Masaüstü
5 sn
3
Cevap
0
Favori
3.023
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
Öne Çıkar
0 oy
Sayfa: 1
Giriş
Mesaj
  • bir ödev için math.h fonksiyonunu kullanmadan c dilinde kök alma fonksiyonu yazmam lazım. benim yazdığım program 1'den büyük sayılar için güzel çalışıyor ama sinüs,cosinüs hesabı da olacağından bana 0 ve 1 arasında da çalışması lazım. ancak bu program orda hata veriyor. nasıl düzeltebilirim?

    #include<stdio.h>
    #include<conio.h>

    int main()
    {
    double i,j;
    float num;
    j=0.000001;


    printf("number : ");
    scanf("%f",&num);

    for(i=0;i<num;i=i+j)
    {
    if((i*i)>=num)
    {
    i=i-j;
    break;
    }
    }
    printf("%.5f",i);
    getch();
    return 0;
    }


    not: arkadaşlar bu programı başka bir programın içinde fonksiyon olarak kullanacağım. ordan gelecek değişken float türünde olacak. yani kökü alınacak sayı float tipinde olmalı, geri kalan değişkenler herhangi bir tipte olabilir.

    şimdiden teşekkür ederim.



    < Bu mesaj bu kişi tarafından değiştirildi deneyici23 -- 30 Ekim 2014; 12:48:27 >



    _____________________________




  • Merhaba,

    Asagida hayran kalinabilecek bir kod var. Queke III icerisinde 1999 yilinda kullaniliyor. Kok alma islemini O(1)'de yapiyor.

    Daha detayli bilgiyi buradan bulabilirsin.

     
    // tert kok alma islemini yapar. Kodun orjinalini bozmamak icin yeni bir fonksiyon yazdim asagida.
    // 1 / sqrt(f) islemini yapar.
    float Q_rsqrt( float number )
    {
    long i;
    float x2, y;
    const float threehalfs = 1.5F;

    x2 = number * 0.5F;
    y = number;
    i = * ( long * ) &y; // evil floating point bit level hacking
    i = 0x5f3759df - ( i >> 1 ); // what the fuck?
    y = * ( float * ) &i;
    y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration
    // y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed

    return y;
    }

    // bu fonksiyon istenilen sqrt(f)'i doner.
    float fast_sqrt(float f) {
    return 1 / Q_rsqrt(f);
    }


    Yalniz belirtmek isterim ki belirli bir oranda hata payi var. Ancak kucuk sayilarda virgulden sonra 2-3 basamaga kadar sorun olmuyor diye biliyorum.



    < Bu mesaj bu kişi tarafından değiştirildi qamyoncu -- 1 Kasım 2014; 11:56:11 >
    _____________________________
    Yanmışsam, külümden doğacak bir hisar vardır.




  • qamyoncu Q kullanıcısına yanıt
    John Carmack'in Efsane Kodu Değil Mi Bu ? :)
    _____________________________
  • Yapay Zeka’dan İlgili Konular
    İ.T.P. az bilinen bir hastalık
    19 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.