SORU
9 Ocak 2012, PAZARTESİ


Yöntemde bir değişiklik dönen yüzer yüzer sonuç döküm sonucu

Neden bu baskı False kod yapar .NET 4? Bazı beklenmeyen davranış açık dökme neden oluyor gibi görünüyor.

Cevap ötesini istiyorum "kayan nokta yanlış" ya da "yapma".

float a(float x, float y)
{
  return ( x * y );
}

float b(float x, float y)
{
  return (float)( x * y );
}

void Main()
{
  Console.WriteLine( a( 10f, 1f/10f ) == b( 10f, 1f/10f ) );
}

PS: bir birim testi kod geldi Bu onay kodu.
PPS: birim testi geçiyordu .NET 3.5, ama şimdi yükseltmeden sonra başarısız olur .NET 4.

CEVAP
9 Ocak 2012, PAZARTESİ


David'in yorum doğru ama yeterince güçlü. Bu hesaplama yapıyor garanti yokiki kez aynı programdaaynı sonuçlar.

# Şartname C bu konuda son derece açıktır:


-Kayan nokta işlemleri operasyon sonucu tip daha yüksek hassasiyetle gerçekleştirilebilir. Örneğin, bazı donanım mimarileri destekleyen bir “genişletilmiş” veya “long double” kayan nokta türü ile daha fazla kapsama alanı ve daha hassas çift yazın ve dolaylı olarak gerçekleştirmek tüm kayan nokta işlemi kullanarak bu yüksek hassasiyetli yazın. Sadece aşırı maliyet performansı gibi donanım mimarileri yapılması için gerçekleştirmek kayan nokta işlemi ile daha az hassas, ve yerine gerektiren bir uygulama için ceza hem de performans ve hassas, C# sağlayan bir yüksek hassasiyetli türü için kullanılacak tüm kayan nokta işlemi. Daha kesin sonuçlar veren başka, bu nadiren herhangi bir ölçülebilir etkisi yoktur. Ancak, ifade formu, x * y / z, çarpma üreten bir sonucu olması dışında çift menzilli, ama sonraki bölüm getiriyor geçici sonuç arkasına çift Aralık, gerçeği ifade değerlendirilir daha yüksek bir dizi neden olabilir biçiminde bir sonlu sonuç için üretilen yerine bir sonsuzluk.


C# derleyicisi, değişimi ve zamanı vermek için geniş lattitude vardaha doğru sonuçlardaha çok tutarlı bir şekilde bunu yapmak için gerekli değildir kapris bir ... ... herhangi bir zamanda gerekli belirtimi,, ve aslında onlar değil.

Eğer hoşuna gitmedi ise bu ikili kayan noktalı sayılar kullanmayın; ya ondalık ya da keyfi hassas rasyonel çözümlerin üzerine çıkıp kullanın.

Döner yüzen bir yöntem içinde yüzer döküm yapar fark yaratıyor anlamıyorum

İyi noktaya parmak bastın.

Örnek program küçük değişiklikler büyük etkilere neden olabilir gösterilmiştir. Çalışma zamanı sürümü, yüzer döküm açıkça bunu yapmamak daha farklı bir sonuç verir unutmayın.Açıkça yüzer atama, C# derleyici, çalışma zamanı için bir ipucu verirdemek "eğer bu optimizasyon kullanıyor başına ekstra yüksek hassasiyet modu dışında şunu". Şartname notları gibibu potansiyel performansın bir bedeli vardır.

Böylece tur için "doğru" sadece mutlu bir rastlantı değil; doğru cevap bu durumda . çünkü elde edilen cevap bu olur ^em>kaybetme hassas doğru yönde kaybetmek oldu.

Nasıl .net 4 farklı?

Ne fark var arasında 3.5 ve 4.0 çalışma zamanları; fark açıkça 4.0, Jetta seçer gitmek için yüksek hassasiyetli sizin özel durumda, ve 3.5 değişimi seçer değil. Bu durum 3.5; çalışma zamanı, her sürüm ve C her sürümünde mümkün olmuştur imkansız olduğu anlamına gelmez# derleyici. Sadece, makinenize, bilgilerini farklı bir durum rastlamak oldu. Ama titreme varher zamanbu optimizasyonu yapmak için izin, ve hep kendi isteğiyle yaptı.

C# derleyicisi de tamamen bilgisayar sabit derleme zamanında yüzer benzer yöntemini seçmek, onun en tabi hakkı. Görünüşte özdeş sabitler hesaplamaları farklı olabilir iki derleyici, çalışma zamanı devletin ayrıntıları bağlı olarak oluşur.

Daha genel olarak, kayan noktalı sayılar gerçel sayıların cebirsel özellikleri var ve bu beklenti tamamen gerçeklerle; bu cebirsel özellikleri yoktur. Kayan nokta işlemleri bile değililişkilendirilebilir; kesinlikle onları beklemek göründüğün gibi çarpma tersler kanunlarına itaat etmeyin. Kayan nokta sayıları sadece gerçek aritmetik bir yaklaşım;, diyelim ki, fiziksel bir sistem taklit, ya da Özet istatistikleri hesaplama için yeterince yakın, ya da onun gibi bir şey olan bir yaklaşım.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Migs351

    Migs351

    3 HAZİRAN 2007
  • PorterRobinsonVEVO

    PorterRobins

    11 Kasım 2013