Aracılığıyla paylaş


Kayan nokta geçiş sorunları

Bazen projelerinizi Visual Studio'nun daha yeni bir sürümüne yükselttiğinizde, belirli kayan nokta işlemlerinin sonuçlarının değiştiğini fark edebilirsiniz. Bu genellikle iki nedenden biri nedeniyle gerçekleşir: Kullanılabilir işlemciden daha iyi yararlanan kod oluşturma değişiklikleri ve C çalışma zamanı kitaplığındaki (CRT) matematik işlevlerinde kullanılan algoritmalarda hata düzeltmeleri veya değişiklikler. Genel olarak, yeni sonuçlar dil standardı tarafından belirtilen sınırlar içinde doğrudur. Nelerin değiştiğini ve önemli olup olmadığını öğrenmek için okumaya devam edin. İşlevlerinizin daha önce aldığı sonuçların aynısını nasıl elde edersiniz.

Yeni matematik işlevleri ve Evrensel CRT değişiklikleri

CRT matematik işlevlerinin çoğu yıllardır Visual Studio'da kullanılabilir, ancak Visual Studio 2013'te başlayarak ISO C99 için gereken tüm işlevler dahil edilmiştir. Bu işlevler, performansı doğrulukla dengelemek için uygulanır. Her durumda doğru yuvarlatılmış sonucun üretilmesi çok pahalı olabileceğinden, bu işlevler doğru yuvarlanmış sonuca yakın bir tahmini verimli bir şekilde üretecek şekilde tasarlanmıştır. Çoğu durumda, üretilen sonuç doğru yuvarlanmış sonucun +/-1 en az duyarlık birimi veya ulp birimi içindedir, ancak daha fazla yanlışlık olduğu durumlar olabilir. Bu işlevleri daha önce almak için farklı bir matematik kitaplığı kullandıysanız, sonuçlarınızdaki değişiklik uygulama farklılıklarından sorumlu olabilir.

Matematik işlevleri Visual Studio 2015'te Evrensel CRT'ye taşındığında bazı yeni algoritmalar kullanıldı ve Visual Studio 2013'te yeni olan işlevlerin uygulanmasındaki çeşitli hatalar düzeltildi. Bu değişiklikler, bu işlevleri kullanan kayan nokta hesaplamalarının sonuçlarında algılanabilir farklılıklara yol açabilir. Hata sorunları olan işlevler erf, exp2, remainder, remquo, scalbln ve scalbn ile bunların float ve long double varyantlarıydı. Visual Studio 2015'teki diğer değişiklikler _clear87, _clearfp, fegetenv, fesetenv ve feholdexcept işlevlerinde kayan nokta durum sözcüğünü ve özel durum bilgilerini koruma sorunları düzeltildi.

İşlemci farklılıkları ve derleyici bayrakları

Kayan nokta matematik kitaplığı işlevlerinin birçoğu farklı CPU mimarileri için farklı uygulamalara sahiptir. Örneğin, 32 bit x86 CRT, 64 bit x64 CRT'den farklı bir uygulamaya sahip olabilir. Ayrıca, bazı işlevlerin belirli bir CPU mimarisi için birden çok uygulaması olabilir. En verimli uygulama, CPU tarafından desteklenen yönerge kümelerine bağlı olarak çalışma zamanında dinamik olarak seçilir. Örneğin, 32 bit x86 CRT'de bazı işlevlerin hem x87 uygulaması hem de SSE2 uygulaması vardır. SSE2'yi destekleyen bir CPU üzerinde çalışırken, daha hızlı SSE2 uygulaması kullanılır. SSE2'yi desteklemeyen bir CPU üzerinde çalışırken, daha yavaş x87 uygulaması kullanılır. Visual Studio 2012'de varsayılan x86 derleyici mimarisi seçeneği /arch:SSE2 olarak değiştirildiğinden, eski kodu geçirirken bunu görebilirsiniz. Matematik kitaplığı işlevlerinin farklı uygulamaları, sonuçlarını üretmek için farklı CPU yönergeleri ve farklı algoritmalar kullanabileceğinden, işlevler farklı platformlarda farklı sonuçlar üretebilir. Çoğu durumda, sonuçlar doğru yuvarlanmış sonucun +/-1 ulp içindedir, ancak gerçek sonuçlar CPU'lar arasında farklılık gösterebilir.

Visual Studio'daki farklı kayan nokta modlarında kod oluşturma doğruluğu geliştirmeleri, aynı derleyici bayrakları kullanıldığında bile eski kod yeni kodla karşılaştırıldığında kayan nokta işlemlerinin sonuçlarını da etkileyebilir. Örneğin, /fp:precise (varsayılan) veya /fp:strict belirtildiğinde Visual Studio 2010 tarafından oluşturulan kod, ifadeler aracılığıyla ara sayı olmayan (NaN) değerleri doğru yaymamış olabilir. Bu nedenle, eski derleyicilerde sayısal sonuç veren bazı ifadeler artık doğru bir NaN sonucu üretebilir. Şimdilik etkinleştirilen /fp:fast kod iyileştirmeleri daha fazla işlemci özelliğinden yararlandığından farklılıklar da görebilirsiniz. Bu iyileştirmeler daha az yönerge kullanabilir, ancak daha önce görünür olan bazı ara işlemler kaldırıldığı için oluşturulan sonuçları etkileyebilir.

Aynı sonuçları alma

Çoğu durumda, en yeni derleyicilerde ve kitaplıklarda kayan nokta değişiklikleri daha hızlı veya daha doğru davranışlara veya her ikisine de neden olur. SSE2 yönergeleri x87 yönergelerini değiştirdiğinde bile daha iyi işlemci güç performansı görebilirsiniz. Ancak, eski bir derleyicinin kayan nokta davranışını tam olarak çoğaltması gereken kodunuz varsa, Visual Studio yerel çoklu hedefleme özelliklerini kullanmayı ve etkilenen projeyi eski araç takımıyla oluşturmayı göz önünde bulundurun. Daha fazla bilgi için bkz . Eski projeler oluşturmak için Visual Studio'da yerel çoklu hedeflemeyi kullanma.

Ayrıca bkz.

Visual C++'ın önceki sürümlerinden projeleri yükseltme
Olası Yükseltme Sorunlarına Genel Bakış (Visual C++)
Visual C++ değişiklik geçmişi 2003 - 2015