En yakın tam sayıya bölünme sonucunun yuvarlanması pretty simple. Ama bölümlemenin bir sonucunu tamamlamaya çalışıyorum, böylece sonraki operasyon en iyi yaklaşımı verecektir. Bu en iyi, basit bir işlev tarafından anlatılmış:Yuvarlama y = x * x en yakın
const int halfbits = std::numeric_limits<unsigned int>::digits/2;
unsigned x = foo(); // Likely big.
unsigned x_div = x >> halfbits; // Rounded down
unsigned y = x_div * x_div; // Will fit due to division.
Ben 1<<(halfbits-1)
ekleyerek en yakın x_div
tamamlayabilirler. Fakat x² doğrusal bir fonksiyon olmadığı için, y genelde doğru şekilde yuvarlanmamıştır. Daha büyük tipleri kullanmadan (x*x) >> (halfbits*2)
hesaplamak için basit ve daha doğru bir yolu var mı?
x_div'e 3<<(halfbits-3)
eklenmesi yuvarlamayı iyileştirir, ancak bunun en iyi çözüm olduğunu kanıtlayamaz. Ayrıca, bu xⁿ için genelleştirilmiş olabilir?
numaralı telefonu düzenle: popüler taleple soruyu, saf aritmetik terimlerle "çevirme" özgürlüğünü (bu C bit kaydırıcı şeyden hiçbiri ...) almam.
Not: Tüm bölümler daha sonra tamsayı bölümleridir, örneğin 13/3 4 olur.
Sorun: x^2 hesaplayamayız çünkü x büyüktür, dolayısıyla bunun yerine hesaplama yapmak isteriz (x^2)/(2^H).
bu yüzden hesaplamak
x_div = X/sqrt (2^K)
yapmak için Ardından da kare:
y = x_div * x_div
Bununla birlikte, bu sonuç, (x^2)/(2^N)
tam değeri, tipik olarak kısa ve OP daha iyi sonuçlara ulaşmak için 0.5 * sqrt (2^N) veya belki 0.375 * sqrt (2^N) eklemeyi önerir ...
Oli Charlesworth
'un yanıtı, gerçek değer, x^2
(x_hi + x_lo)^2 olarak düşünerek.
Bit ops'ları ile kaybolmadım, ama belki de işlemleri matematiksel merkezli ve daha az merkezli bir şekilde yeniden ifade edebilir misiniz? Akıl almaz olmaya çalışmıyorum, sadece sorunun çözülmesine yardımcı olacağını ve hedefinizi belirlemeye yardımcı olacağını düşünüyorum. –
Denenmesi gereken birkaç şey: 'x_div_down * x_div_up',' x_div_near * x_div_near'. Eğer zamanı harcamaya istekliyseniz, '' (x_div * x_rest) >> (halfbit-1) ''i hesaplayabilir ve sonucu düzeltebilirsiniz. –
Yani, sadece (x * x) >> (halfbits * 2) 'tarafından ima edilen, açık olmak gerekirse, aslında * yuvarlanmamış * bit-doğru sonucu? Yoksa matematiksel sonucun doğru bir şekilde yuvarlanmasını ister misiniz? – hyde