SORU
20 HAZİRAN 2014, Cuma


Kayan nokta değişkenleri kapsamında değerlerini etkiler mi?

Aşağıdaki C kullanırsak# bir kod konsol uygulaması, The sums are Not equal gibi bir mesaj alırız.

Eğer satır System.Console.WriteLine(), uncommenting sonra biz çalıştırmak için The sums are equal gibi bir mesaj alırız.

    static void Main(string[] args)
    {
        float f = Sum(0.1f, 0.2f);
        float g = Sum(0.1f, 0.2f);

        //System.Console.WriteLine("f = "   f   " and g = "   g);

        if (f == g)
        {
            System.Console.WriteLine("The sums are equal");
        }
        else
        {
            System.Console.WriteLine("The sums are Not equal");
        }
    }

    static float Sum(float a, float b)
    {
        System.Console.WriteLine(a   b);
        return a   b;
    }

Bu davranış için gerçek nedeni nedir?

CEVAP
20 HAZİRAN 2014, Cuma


Kapsam Madde ile ilgili değildir. Dinamik ve kayan nokta işleme yığının kombinasyon. Uygulamaları biraz bilgi bu mantığa aykırı davranış açık hale getirecektir.

Console.WriteLine açıklamalı, f g değerlendirme üzerinde değerler yığını ve orada Ana yöntem eşitlik testi geçtin bitene kadar kal.

Console.Writeline değil yorumladı değerleri f g taşınmış değerlendirme yığına çağrı yığını şu anda çağırma, geri değerlendirme yığın Console.WriteLine döndürür. Ve 12 ** daha sonra karşılaştırma yapılır. Bazı yuvarlama bu çağrı yığını ve bilgiler kaybolmuş olabilir bazı değerlerin saklanması sırasında ortaya çıkabilir.

Console.WriteLine, f g karşılaştırma test çağır, burada her senaryoda aynı değerleri değil. Kopyalanmış hassas ve yuvarlama ile ilgili farklı kurallar, sanal makine tarafından bir biçimi restore ettiler.

Console.WriteLine çağırma belirtilmiş olan zaman belirli bir kod, değerlendirme yığını asla çağrı yığını için saklanır ve yuvarlama oluşur. Değerlendirme yığında platform uygulamaları için geliştirilmiş hassas sağlamak için izin verilir, çünkü bu tutarsızlık ortaya çıkabilir.

EDİTBu durumda düşüyoruz ne CLİ belirtimi tarafından izin verilir. Bölüm I. 12.1.3 okur:

Kayan nokta numaraları (statik, dizi elemanları için depolama konumları sınıflar ve alanlar sabit büyüklüktedir. Desteklenen depolama boyutu vardır float32 ve float64. Her yerde (değerlendirme yığını, dönüş türleri olarak, ve yerel değişkenler) kayan nokta sayıları temsil kayan noktalı dahili bir türü kullanıyor. Her bu örnek, değişken veya ifade nominal türüdür ya float32or float64, ama onun değeri DAHİLİ olarak temsil edilebilir ek aralığı ile ve/veya hassas. İç boyutu kayan nokta uygulanmasına bağlı olarak değişebilir temsili, ve hassas olacaktır az değişken ya da o kadar büyük ifade temsil ediliyor.

Bu tekliften anahtar kelime "uygulama-bağımlı" ve "değişebilir". OP durumda, onun uygulama gerçekten değişir mi görürüz.

Java platformunda olmayan strictfp kayan nokta aritmetik de ilgili bir konu, daha fazla bilgi de Will floating point operations on the JVM give the same results on all platforms? benim cevap kontrol etmek için vardır

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • iNCH

    iNCH

    20 Temmuz 2009
  • Make:

    Make:

    23 Mart 2006
  • Menglong Tav

    Menglong Tav

    18 Temmuz 2010