2016-02-19 70 views
14

çoğaltımına göre optimize eder. Bu soruya bağlı olarak Floating point division vs floating point multiplication. Bölüm, bazı sebeplerden dolayı çarpmadan daha yavaştır.Derleyici, bölmeyi

Derleyici, genellikle, varsa, bölme ile çarpma yerini alacak mı? Örneğin

:

float a; 
// During runtime a=5.4f 
float b = a/10.f; 

o olacak:

float a; 
// During runtime a=5.4f 
float b = a*0.1f; 

olsun, hani VS2013 varsayılan derleyici kullanıyorum bir derleyici güvenilir bir soru olarak kabul edilir. Ancak, jenerik bir cevabım (bu optimizasyonun teorik geçerliliği)

+1

Karşılıklı çarpma yapabilmek için derleyicinin bir bölme yapması gerekmiyor mu? – NathanOliver

+2

Bu, "eğer mümkünse" kapsamına dahil değilse, bu bir doğruluk kaybı kabul edilmediği takdirde mümkün olmadığı bir durumdur. Yani, umarım sadece, özellikle buna izin veren bir bayrakla derlerken. – harold

+0

@NathanOliver derleme zamanı bir .. –

cevap

15

Hayır, derleyicinin genel durum için bunu yapmasına izin verilmezse iyi olur: iki işlem bit-özdeş olmayan sonuçlar üretebilir Karşılıklı temsiliyet hatası nedeniyle.

Örneğinizde 0.1, float numaralı tam temsil hakkına sahip değildir.

float f = 21736517; 
float a = f/10.f; 
float b = f * 0.1f; 
cout << (a == b) << endl; // Prints zero 

Demo.

Not: doğru aşağıda açıklamada notlarınjuffa gibi durumlar olduğunda derleyici olabilir markasını Bu farklılık 10 tarafından 0.1 ve bölünerek çoğalması sonuçlarını neden olur this paper'da açıklandığı gibi geniş bir sayı kümesi için bazı optimizasyonlar. Örneğin, ikisinin gücü ile çarpma veya bölme, IEEE-754 float gösteriminin üs bölgesine ilave edilmesine eşdeğerdir.

+3

Derleyicinin dönüştürmeyi yapmasını isterseniz umurumda değil (gcc's -ffast-math', MSVC'nin eşdeğeri ne olursa olsun). –

+1

C++ 'nın kayan noktayı ne kadar açık olarak tanımladığını, yanlış olduğunu düşünüyorum. Derleyici * bunun için * izin verilir. Ancak, çoğu tercih etmemeyi tercih ediyorlar (hızın maliyetinde daha fazla doğruluk sağlamayı tercih ediyorlar). –

+3

Bir bit-özdeş sonuçları korurken bir kayan noktalı bölümün bir çarpma * ile kolayca değiştirilebileceği durumları ayırmak gerekir *. IEEE-754 aritmetiği olan platformlar için, bu, tersin gösterilebildiği durumda, 2'nin gücü olan sabit bölenler için geçerlidir. Derleyicileri bu optimizasyonu uygularken gördüm (ör. 2.0'a bölünme, 0,5 ile çarpıyor). [Bu yazı] 'da (http://perso.ens-lyon.fr/nicolas.brisebarre/Publi/fpdivision.pdf) açıklandığı gibi, daha geniş aralıktaki diğer sabit bölümlere uygulanabilir bir teknik vardır. Ne yazık ki, herhangi bir derleyiciyi kullanmadığını görmedim. – njuffa