19 Ekim 2017 Perşembe

Yuvarlama - Rounding

Giriş
Yuvarlama metodları C++98'te yoktu. C++03 çıktığında C metodlarına eklenmişti ancak C++03 halen altta C90 metodlarını kullandığı için resmi olarak bu sürümde de round metodları yoktu.

C++11 altta artık nihayet C99 metodlarını kullandığı için bu sürümde nihayet round metodlarını kullanabiliyoruz.

Kendi Yuvarlama Metodumuz

1. En Yakın Sayıyya Yuvarlama
Birçok kaynakta kendi yuvarlama metodumuzu yazmak istersek şöyle bir şey yapmamız öneriliyor.
double round(double d)
{
  return floor(d + 0.5);
}
0.5 için = 1 verir
0.4 için = 0 verir
0.49999999999999994 = 0 vermesi gerekiyor ancak 1 verir!

Dolayısıyla kendi metodumuzu yazmak kolay değil.

2. Bir Küçük Çift Sayıya Yuvarlama
İstenen şey şöyledir.
f(8)=8
f(9)=8
Çözüm
Şöyle yaparız
x = x/2*2;
Çözüm
Şöyle yaparız. Yani LSB biti 0 yaparız.
x & (~1u)
boost
Eğer kullandığımız derleyicide yuvarlama metodları yoksa ve kendimiz de yazmak istemiyorsak boost kullanabiliriz. round(), iround(), lround() metodları var.
#include <boost/math/special_functions/round.hpp>

double a = boost::math::round(1.5); // Yields 2.0
int b = boost::math::iround(1.5); // Yields 2 as an integer
Örnek
#include <boost/math/special_functions/round.hpp>
using boost::math::lround;
cout << lround(0.0) << endl;
C++11 
std::round(), std::lround() ve std::llround() metodları var.
std::round floating point alır ve floating point döner.
std::lround floating point alır ancak long döner
std::lround floating point alır ancak long long döner



Hiç yorum yok:

Yorum Gönder