Giriş
Şu satırı dahil ederiz.
Şöyle yaparız. İkinci parametre 1.0'dan sonraya veya önceye gitmek istediğimizi belirtir
Açıklaması şöyle
Generic yardmcı metodlarımız olsun istersek şöyle yaparız.
Şu satırı dahil ederiz.
#include <cmath>
Açıklaması şöyleTo increase/decrement a floating point value by the smallest possible amount, use nextafter towards +/- infinity().Bu metod C99 ve C++11 ile eklendi. Eğer daha eski bir derleyici kullanıyorsak C++ için şöyle yaparız.
If you just use next_after(x,std::numeric_limits::max()), the result with be wrong in case x is infinity.
#include <limits>
typedef std::numeric_limits<double> lim_dbl;
double closest_to_1 = 1.0 - lim_dbl::epsilon()/lim_dbl::radix;
KullanımŞöyle yaparız. İkinci parametre 1.0'dan sonraya veya önceye gitmek istediğimizi belirtir
std::nextafter(1., 0.); // 0.99999999999999989
std::nextafter(1., 2.); // 1.0000000000000002
Aynı şeyi C ile şöyle yaparız.#include <math.h>
double closest_to_1 = nextafter(1.0, 0.0);
Denormal SayıAçıklaması şöyle
std::nextafter() is allowed to return a subnormal numberŞöyle yaparız.
double next = std::nextafter(0.0, 1.0);
Çıktı olarak şunu alırız.next: 4.94066e-324
Yardımcı MetodlarGeneric yardmcı metodlarımız olsun istersek şöyle yaparız.
template<typename T>
T next_above(const T& v){
return std::nextafter(1.0,std::numeric_limits<T>::infinity()) ;
}
template<typename T>
T next_below(const T& v){
return std::nextafter(1.0,-std::numeric_limits<T>::infinity()) ;
}
Şöyle yaparız.std::cout << next_below(1.0) << std::endl;
std::cout << next_above(1.0) << std::endl;
Küçük bir not olarak şunu eklemek lazım. Positive infinity bir şekilde std::nextafter ile geriye alınabiliyor. Şöyle yaparız. İkinci örnekte görülebilir.std::cout << std::nextafter(std::numeric_limits<double>::infinity(),
std::numeric_limits<double>::infinity()) << std::endl; // gives inf
std::cout << std::nextafter(std::numeric_limits<double>::infinity(),
std::numeric_limits<double>::max()) << std::endl; // gives 1.79769e+308
Hiç yorum yok:
Yorum Gönder