NeverTellLie
Öğrenci
- Katılım
- 14 Nisan 2017
- Mesajlar
- 56
- Reaksiyon puanı
- 2
- Puanları
- 8
- Yaş
- 29
         Hatam nedir acaba?
			
			
 .C dilini bir kitap ile öğrenmeye çalıştığım için aynısını geçirmişim robot gibi düşünememişim
.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.
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.
		
		
	
	 
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.
int CompareFloat(float float1, float float2)
{
   float precision = 0.001;
   if(((float1 - precision) < float2) && ((float1 + precision) > float2))
       return 1;
   else
       return 0;
}if (CompareFloat(k1, 0.0f))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.
Örnek kullanımKod:int CompareFloat(float float1, float float2) { float precision = 0.001; if(((float1 - precision) < float2) && ((float1 + precision) > float2)) return 1; else return 0; }
--- Gönderi Güncellendi ---Kod:if (CompareFloat(k1, 0.0f))
Ekleme: float yerine double yaparsan precision değerini 0.000001 düşürebilirsin ve 0.0f yerine 0.0 yazman gerekir.
 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
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

