Şimdi Ara

Java ve C++ , iki kod arasında farkın sebebini bilen var mı?

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
6
Cevap
0
Favori
243
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Arkadaşlar, normalde araştırarak sonuca gidiyorum da, ama google'a ne yazacağımı tam kestiremedim

    C++ 'da şu kod "They are not equal" derken

    int main(){
    double x = 1.0;
    double y = x / 3.0;
    if (x == y *3.0) cout << " They are equal !";
    else cout << " They are NOT equal .";
    return 0;
    }


    Aynı kod Java da "They are equal" diyor
    public class Sample {
    public static void main(String[] args){
    double x = 1.0;
    double y = x / 3.0;
    if (x == (y *3.0))
    System.out.println(" They are equal !");
    else{
    System.out.println(" They are NOT equal .");
    }

    }
    }


    sebebi bilen var mı?







  • Ben denedim , equal oldugunu iddia ediyor. oracle jdk 1.7 ile calistirdim.
    1/3 isleminin precision ayari jvm den jvm e fark gosterebilir, o yuzden bigDecimal kullanmani tavsiye ederim bu islemlerde. Double ve float bunlar icin uygun degil, ornegin parasal islemler.

    Yaptigin islemi BigDecimal ile wrap ederek denersen aslinda 1/3.0 = 0.333333333333333314829616256247390992939472198486328125 , y *3.0 = 0.999999999999999944488848768742172978818416595458984375 gib bir deger cikiyor.

    < Bu ileti tablet sürüm kullanılarak atıldı >
  • Teknik olarak bu sonuçları her makine farklı hesaplayabilir. Ama bu hata o kadar küçüktür ki gözardı edilebilir. Yani aslında sen "==" kullanarak hatalı bir if yapısı açıyorsun. Double ve Float karşılaştırmaları biraz farklı çalışıyor ;

    https://en.wikipedia.org/wiki/Floating_point

    Double için :

    Double.compare yapısı kullanabilirsin. Yada kendi karşılaştırma fonksiyonunu yazabilirsin. Basit olarak virgülden sonraki 5 basamağa kadar kontrol edersin. Eğer Abs(x-y) <= 0.000001 gibi çıktı verirse kendi işlemlerini yaparsın. Java'nın Double.compare methodu ise böyle değil. Parametreler Double.NaN gelirse eğer, true olarak döndürüyor. Yada aralarında +0.0 veya -0.0 gibi bir değer farkı için de false döndürüyor. Ki true döndürmesi gerekir. Yazılımda ise 0.1d + 0.2d = 0.3d değildir. Teknik olarak doğru fakat yanlış bir önermedir. Tam tersi f içinde geçerlidir.

    Float için :

    Double veya Float'ı "==" ile karşılaştırmak tamamen kötü bir yazılımcı işidir eğer yeni değilse. Bu kesinlikle önerilemez. En mantıklı ve geçerli yolu, şuan için iki değeri Abs alıp Epsilon'dan çıkarmak olacaktır. İster hata payını yani epsilon'a kendin parametre ver, ister readonly final tanımla fark etmiyor. Tamamen sana kalmış birşey. Hata payı olması az istenen yerlerde küçük değer girmek doğru olacaktır. Bu şekilde çok çok az bir hata payı ile sonuca varılabilir. Float.compare 'de aynı şekilde. -0.0f == +0.0f true döndürüyor. Ama bu bir hatadır. .equals methodu bunu false döndürerek doğru bir iş yapacaktır.

    https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/

    Nümerik analiz dersine selam. :D Gerçek hayatta nerede kullanılacağını anlamamış birileri olabilir.

    Sağlıcakla...




  • Java Puzzlers (Joshua Bloch) kitabında bak Puzzle 2

    < Bu ileti mini sürüm kullanılarak atıldı >
  • @seyfi84 ne alakası var birader, okuduğum kitapta aynı hataya yer vermiş. Düzeltmek için bir kaç farklı kod bile eklemiş

    @revivo72 ve @Dentrax cevaplar için teşekkürler.



    < Bu mesaj bu kişi tarafından değiştirildi monarch25 -- 4 Mart 2017; 20:51:10 >
  • Optimizasyon açıyorsanız o c++ kodu cout hariç komple silinir yanlız. Tabi derleyiciniz çok eski değilse.
  • Yapay Zeka’dan İlgili Konular
    Daha Fazla Göster
    
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.