2011-12-04 45 views
6

Pencerelerde ve linux üzerinde C++ program çalıştırıyorum. çıkışının aynı olması amaçlanmıştır. Tek farklılıkların, işten ayrılma farklılıklarına karşı olan gerçek farklılıklar olduğundan emin olmaya çalışıyorum. Şu ana kadar farklılıklarından kaynaklanabilecek tüm farklılıkları dikkate aldım ama anlayamadığım bir şey var. pencerelerde İmzası sıfır linux vs windows

dışarı 0,000 ve linux herhangi biri ne olduğunu fark yaratıyor olabilir bilen var mı -0,000

olduğunu var koydu? Muhtemelen iyileştirici bazı FP hesaplamalar optimize nasıl farklılıklar gelen thanx

+4

Bunun çıktısını veren bir kod parçası göstermediğiniz söylenmesi zor :) – favoretti

+0

Farketmez, farketmez veya nasıl görüyorsunuz. İmzalı/imzasız sıfır ile ne yapacaksınız? Ekle? Mutliply mi? Buna bölmek mi? – FailedDev

+0

@FailedDev: Fark yaratıyor. 0'a eğilimli bir işlevi düşünün, ya y ekseninin negatif kısmından ya da y ekseninin pozitif kısmından gelebilir. – ninjalj

cevap

1

IEEE kayan nokta biçiminde, işaret biti değerinden ayrı olduğu için, 0'ın iki farklı değerine, pozitif ve negatif bir değere sahip olursunuz. Çoğu durumda bir fark yaratmaz; Her iki sıfır da eşit olarak karşılaştırır ve aynı matematiksel değeri tanımlarlar (matematiksel olarak 0 ve -0 aynıdır). Farkın önemli olabileceği durumlarda, alt akışınız olduğunda ve alt akışın pozitif veya negatif bir değerden mi oluştuğunu bilmeniz gerekir. Ayrıca, 0'a bölerseniz, aldığınız sonsuzluğun işareti, 0 işaretine bağlıdır (yani 1/+ 0.0, + Inf verir, ancak 1/-0.0, -Inf verir). Başka bir deyişle, muhtemelen sizin için bir fark yaratmayacaktır. Bununla birlikte, farklı çıktıların, numaranın kendisinin farklı olduğu anlamına gelmediğini unutmayın. Windows'daki değer de -0.0 olabilir, ancak Windows'daki çıktı rutinleri +0.0 ile -0.0 arasında ayrım yapmazlar (hepsinden sonra eşittirler).

7

(yani yapılandırılabilir olabilir - örneğin here bakınız); Bir durumda, diğer biraz daha fazla 0, biraz daha az bir değer alırsınız. Her iki çıkış da 0.000'a yuvarlanır, ancak "gerçek" işaretlerini korurlar.

1

-ffast-math gibi kullanarak (güvensiz) bayraklar sürece, derleyici IEEE-754 aritmetik ' optimize ' ne zaman yapabilirsiniz varsayımlara sınırlıdır. İlk önce her iki platformun da aynı yuvarlamayı kullandığını kontrol edin. Ayrıca, eğer mümkünse, aynı kayan nokta birimini kullandıklarını kontrol ediniz. yani, x86 üzerinde SSU vs FPU. İkincisi matematik kütüphanesi fonksiyon uygulamalarıyla ilgili bir konu olabilir - özellikle trigonometrik/transandantal fonksiyonlar.

+1

Hangi kayan nokta birimini kullandıklarını nasıl kontrol ederim? – user690936

İlgili konular