İçeriğe geç
ShiftDelete.Net
Haber ara/ SDN'ye SorGiriş
Haber Akışı SDNTV İnceleme Forum Yapay Zeka Akıllı Telefon Elektrikli Otomobil Oyun ShiftDelete.Net Global Teknoloji Haberleri Mobil Otomobil Donanım Savunma Bilim Sosyal Medya İnternet Giyilebilir Teknoloji Rehber Ürünler Son dakika Yazarlar
  1. Ana sayfa
  2. Topluluk
  3. Programlama
  4. Programlama Dilleri
Programlama Dilleri

C dili

NeverTellLie02.05.20179 cevap1.508 görüntüleme
2017'den beri56 mesaj
#1
Adsız by NeverTellLie posted 2 Mayıs 2017 22:37 Hatam nedir acaba?
Cevaplar
2014'den beri9.359 mesaj
#2
Mantık yürüterek şunu söyleyebilirim, "k" değişkenine bir değer atamamışsın.
2017'den beri555 mesaj
#4
fonksiyon hiç yoktan input alsaydı mantıklı görürdüm. Başka bir yerden mi çağırıyorsun, main nerede?
2011'den beri7.329 mesaj
#5
Bir ekleme de ben yapayım.
float aritmetiği ile int aritmetiği farklıdır.(buna tabi ki long ve double gibi değerler de dahil)
k >= 0 dediğin zaman k'nın sıfıra eşit olduğu bir değer için yanlış sonuç bulma ihtimali var.
Çünkü yapılan işlemler sonucu k'nın 0 değil de ona çok yakın 0.0000000001 olma ihtimali var.(Birkaç aritmetik işlem sonucunda kesinlikle böyle olur)
Tabi söz konusu double olunca senin bunu farketme olasılığın çok düşüyor ve programda farkedilmeyen hata oluşuyor. (20 kez doğru çalışan program 1 kez yanlış çalışabiliyor)
Dolayısıyla kayar sayılarda eşitlik işleminin nasıl kontrol edildiğini araştır, bir fonksiyon ile kontrol ediliyor.
NeverTellLie Konuyu açan
2017'den beri56 mesaj
#6
Yardımcı olmaya çalıştığınız için hepinize çok teşekkür ediyorum:).C dilini bir kitap ile öğrenmeye çalıştığım için aynısını geçirmişim robot gibi düşünememişim:(Dediklerinizi uygulamaya çalışınca böyle bir şey çıktı.Yani işlevsiz bir şey gibi gözüküyor acaba neden yani kitapta boşuna yazmazlar herhalde.İlk attığım kitaptakinin aynısıydı şimdi sizin dediklerinizi uygulamaya koyarak böyle bir şey çıkardım.Adsız.png Adsız.png
--- Gönderi Güncellendi ---
Bir ekleme de ben yapayım.
float aritmetiği ile int aritmetiği farklıdır.(buna tabi ki long ve double gibi değerler de dahil)
k >= 0 dediğin zaman k'nın sıfıra eşit olduğu bir değer için yanlış sonuç bulma ihtimali var.
Çünkü yapılan işlemler sonucu k'nın 0 değil de ona çok yakın 0.0000000001 olma ihtimali var.(Birkaç aritmetik işlem sonucunda kesinlikle böyle olur)
Tabi söz konusu double olunca senin bunu farketme olasılığın çok düşüyor ve programda farkedilmeyen hata oluşuyor. (20 kez doğru çalışan program 1 kez yanlış çalışabiliyor)
Dolayısıyla kayar sayılarda eşitlik işleminin nasıl kontrol edildiğini araştır, bir fonksiyon ile kontrol ediliyor.
Hocam biraz araştırdım ama bulamadım phyton ile ilgili bir yazı var ama c dilinde de uygulanır mı bilmiyorum. Kayan Noktalı Sayılarla Aritmetik İşlemler: Sorunlar ve Kısıtlamalar — Resmi Python 3 Kılavuzu
2011'den beri7.329 mesaj
#7
Kitabın henüz çok başında olduğunu tahmin ediyorum.
O yüzden örnekler sadece fonksiyonun işlevini göstermeye yönelik yani anlamsız.

Float problemini birden fazla yöntemle çözebilirsin.
Benim önerim bunun için kendi fonksiyonunu kullanman.
Precision değerini değiştirebilirsin ama bu değerden daha küçük rakamlar için yanlış sonuç verme ihtimali doğabilir.
int CompareFloat(float float1, float float2)
{
   float precision = 0.001;
   if(((float1 - precision) < float2) && ((float1 + precision) > float2))
       return 1;
   else
       return 0;
}

Örnek kullanım
if (CompareFloat(k1, 0.0f))

--- Gönderi Güncellendi ---
Ekleme: float yerine double yaparsan precision değerini 0.000001 düşürebilirsin ve 0.0f yerine 0.0 yazman gerekir.
NeverTellLie Konuyu açan
2017'den beri56 mesaj
#8
Kitabın henüz çok başında olduğunu tahmin ediyorum.
O yüzden örnekler sadece fonksiyonun işlevini göstermeye yönelik yani anlamsız.

Float problemini birden fazla yöntemle çözebilirsin.
Benim önerim bunun için kendi fonksiyonunu kullanman.
Precision değerini değiştirebilirsin ama bu değerden daha küçük rakamlar için yanlış sonuç verme ihtimali doğabilir.
int CompareFloat(float float1, float float2)
{
   float precision = 0.001;
   if(((float1 - precision) < float2) && ((float1 + precision) > float2))
       return 1;
   else
       return 0;
}

Örnek kullanım
if (CompareFloat(k1, 0.0f))

--- Gönderi Güncellendi ---
Ekleme: float yerine double yaparsan precision değerini 0.000001 düşürebilirsin ve 0.0f yerine 0.0 yazman gerekir.
l

Evet hocam daha başındayım kitabın:)Yani kitaptaki her örnek anlamlı değil demek istiyorsunuz.Yukarıda yazdıklarınızdan bir kaç şey çıkardım daha doğrusu anladım ama tam manasıyla anlamadım.Kitapta double için 'İki kat duyarlı gerçel sayı (anabellekte float'a ayrılan basamak uzunluğunun iki katı uzunluğunda yer ayrılır)' yazıyor sizin dediklerinizi de birleştirerek float kesirli sayıları temsil ediyor ancak pi sayısı gibi sıkıntılı kesirli sayırları temsil ederken sorunlar oluştuğu için bu gibi durumlarda double kullanmak daha karlı olup hata payını gözle görülür ölçüde azaltır.Doğru şeyler çıkarabilmiş miyim:):(
düzenlendi
2011'den beri7.329 mesaj
#9
Evet eskiden oyun motoruları fizik hesaplamalarını hızlı olsun diye float ile yapıyorlardı.
Bu da fizik kısımlarında bazı sorunlara sebep oluyordu, misal yerden 1 cm yüksekteki bir araç sanki yere değiyormuş gibi algılanıyordu(yapılan binlerce hesaplama sonucunda, değerlerin bozula bozula gelmesi sonucu)
Günümüzde ise double ile hesaplanıyor.

Bu durum doğrudan atamalarda geçerli değil, misal x = 2.0 dersen bu tam olarak atandığı değeri gösterir, yanlış hatırlamıyorsam float için 7 basamaklı atama yapılabiliyordu, double için çok daha fazla.
Aritmetik işlemlerde geçerli bir durumdan bahsediyoruz yani x = 9.0 / 3.0 - 1.0 değeri tam olarak 2.0 değildir bilmem kaçıncı basamakta illa ki sapıyordur.
NeverTellLie Konuyu açan
2017'den beri56 mesaj
#10
Yardımınız için çok teşekkür ederim hocam.:)

Cevabını yaz

Cevap yazmak için giriş yap ya da üye ol. Eski forum kullanıcı adın ve parolanla girebilirsin.