C dili

Bu konuyu okuyanlar

kmurat

Müdavim
Katılım
8 Şubat 2014
Mesajlar
8,488
Çözümler
3
Reaksiyon puanı
3,711
Puanları
113
Mantık yürüterek şunu söyleyebilirim, "k" değişkenine bir değer atamamışsın.
 

sonerooz

Doçent
Katılım
25 Mart 2017
Mesajlar
555
Reaksiyon puanı
216
Puanları
43
Yaş
29
fonksiyon hiç yoktan input alsaydı mantıklı görürdüm. Başka bir yerden mi çağırıyorsun, main nerede?
 

Ben Kenobi

Müdavim
Katılım
6 Kasım 2011
Mesajlar
7,336
Reaksiyon puanı
3,155
Puanları
113
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

Öğrenci
Katılım
14 Nisan 2017
Mesajlar
56
Reaksiyon puanı
2
Puanları
8
Yaş
28
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
 

Ben Kenobi

Müdavim
Katılım
6 Kasım 2011
Mesajlar
7,336
Reaksiyon puanı
3,155
Puanları
113
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.
Kod:
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
Kod:
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

Öğrenci
Katılım
14 Nisan 2017
Mesajlar
56
Reaksiyon puanı
2
Puanları
8
Yaş
28
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.
Kod:
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
Kod:
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:):(
 
Son düzenleme:

Ben Kenobi

Müdavim
Katılım
6 Kasım 2011
Mesajlar
7,336
Reaksiyon puanı
3,155
Puanları
113
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

Öğrenci
Katılım
14 Nisan 2017
Mesajlar
56
Reaksiyon puanı
2
Puanları
8
Yaş
28
Yardımınız için çok teşekkür ederim hocam.:)
 

Son mesajlar

Üst