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.
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.
Şöyle yaparız
Şöyle yaparız. Yani LSB biti 0 yaparız.
Eğer kullandığımız derleyicide yuvarlama metodları yoksa ve kendimiz de yazmak istemiyorsak boost kullanabiliriz. round(), iround(), lround() metodları var.
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
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 verir0.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)
boostEğ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