5 Eylül 2017 Salı

std::nextafter

Giriş
Şu satırı dahil ederiz.
#include <cmath>
Açıklaması şöyle
To increase/decrement a floating point value by the smallest possible amount, use nextafter towards +/- infinity().

If you just use next_after(x,std::numeric_limits::max()), the result with be wrong in case x is infinity.
Bu metod C99 ve C++11 ile eklendi. Eğer daha eski bir derleyici kullanıyorsak C++ için şöyle yaparız.
#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ı Metodlar
Generic 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