|
|
@@ -13,8 +13,8 @@ |
|
|
|
#pragma once |
|
|
|
|
|
|
|
// |
|
|
|
// The Real class |
|
|
|
// —————————————— |
|
|
|
// The real number class |
|
|
|
// ————————————————————— |
|
|
|
// |
|
|
|
|
|
|
|
#include <lol/base/features.h> |
|
|
@@ -24,40 +24,40 @@ |
|
|
|
#include <string> |
|
|
|
#include <cstdint> |
|
|
|
|
|
|
|
#if _MSC_VER |
|
|
|
# pragma push_macro("min") |
|
|
|
# pragma push_macro("max") |
|
|
|
# undef min |
|
|
|
# undef max |
|
|
|
#endif |
|
|
|
|
|
|
|
namespace lol |
|
|
|
{ |
|
|
|
|
|
|
|
/* This is OUR namespace. Don't let Windows headers mess with it. */ |
|
|
|
#undef min |
|
|
|
#undef max |
|
|
|
|
|
|
|
template<typename T> class Real; |
|
|
|
typedef Real<uint32_t> real; |
|
|
|
|
|
|
|
/* |
|
|
|
* The base class for reals. The only real reason for making this a template |
|
|
|
* class is so we can have implicit constructors ("real x = 1" works) but |
|
|
|
* avoid accidental implicit conversions ("int x = 1; sqrt(x)" will never |
|
|
|
* call real::sqrt). |
|
|
|
*/ |
|
|
|
// |
|
|
|
// The base class for reals. The only real reason for making this a template |
|
|
|
// class is so we can have implicit constructors ("real x = 1" works) but |
|
|
|
// avoid accidental implicit conversions ("int x = 1; sqrt(x)" will never |
|
|
|
// call real::sqrt). |
|
|
|
// |
|
|
|
template<typename T> |
|
|
|
class lol_attr_nodiscard Real |
|
|
|
class lol_attr_nodiscard real_t |
|
|
|
{ |
|
|
|
public: |
|
|
|
typedef T bigit_t; |
|
|
|
typedef int64_t exponent_t; |
|
|
|
|
|
|
|
Real() = default; |
|
|
|
real_t() = default; |
|
|
|
|
|
|
|
Real(float f); |
|
|
|
Real(double f); |
|
|
|
Real(long double f); |
|
|
|
Real(int32_t i); |
|
|
|
Real(uint32_t i); |
|
|
|
Real(int64_t i); |
|
|
|
Real(uint64_t i); |
|
|
|
real_t(float f); |
|
|
|
real_t(double f); |
|
|
|
real_t(long double f); |
|
|
|
real_t(int32_t i); |
|
|
|
real_t(uint32_t i); |
|
|
|
real_t(int64_t i); |
|
|
|
real_t(uint64_t i); |
|
|
|
|
|
|
|
Real(char const *str); |
|
|
|
real_t(char const *str); |
|
|
|
|
|
|
|
static int global_bigit_count(int n = 0) |
|
|
|
{ |
|
|
@@ -70,107 +70,121 @@ public: |
|
|
|
lol_attr_nodiscard bool is_nan() const { return m_nan; } |
|
|
|
lol_attr_nodiscard bool is_inf() const { return m_inf; } |
|
|
|
|
|
|
|
lol_attr_nodiscard operator float() const; |
|
|
|
lol_attr_nodiscard operator double() const; |
|
|
|
lol_attr_nodiscard operator long double() const; |
|
|
|
lol_attr_nodiscard operator int32_t() const; |
|
|
|
lol_attr_nodiscard operator uint32_t() const; |
|
|
|
lol_attr_nodiscard operator int64_t() const; |
|
|
|
lol_attr_nodiscard operator uint64_t() const; |
|
|
|
|
|
|
|
Real<T> operator +() const; |
|
|
|
Real<T> operator -() const; |
|
|
|
Real<T> operator +(Real<T> const &x) const; |
|
|
|
Real<T> operator -(Real<T> const &x) const; |
|
|
|
Real<T> operator *(Real<T> const &x) const; |
|
|
|
Real<T> operator /(Real<T> const &x) const; |
|
|
|
Real<T> const &operator +=(Real<T> const &x); |
|
|
|
Real<T> const &operator -=(Real<T> const &x); |
|
|
|
Real<T> const &operator *=(Real<T> const &x); |
|
|
|
Real<T> const &operator /=(Real<T> const &x); |
|
|
|
|
|
|
|
lol_attr_nodiscard bool operator ==(Real<T> const &x) const; |
|
|
|
lol_attr_nodiscard bool operator !=(Real<T> const &x) const; |
|
|
|
lol_attr_nodiscard bool operator <(Real<T> const &x) const; |
|
|
|
lol_attr_nodiscard bool operator >(Real<T> const &x) const; |
|
|
|
lol_attr_nodiscard bool operator <=(Real<T> const &x) const; |
|
|
|
lol_attr_nodiscard bool operator >=(Real<T> const &x) const; |
|
|
|
// Mark all these operators explicit to avoid surprises |
|
|
|
lol_attr_nodiscard explicit operator float() const; |
|
|
|
lol_attr_nodiscard explicit operator double() const; |
|
|
|
lol_attr_nodiscard explicit operator long double() const; |
|
|
|
lol_attr_nodiscard explicit operator int32_t() const; |
|
|
|
lol_attr_nodiscard explicit operator uint32_t() const; |
|
|
|
lol_attr_nodiscard explicit operator int64_t() const; |
|
|
|
lol_attr_nodiscard explicit operator uint64_t() const; |
|
|
|
|
|
|
|
real_t<T> operator +() const; |
|
|
|
real_t<T> operator -() const; |
|
|
|
real_t<T> operator +(real_t<T> const &x) const; |
|
|
|
real_t<T> operator -(real_t<T> const &x) const; |
|
|
|
real_t<T> operator *(real_t<T> const &x) const; |
|
|
|
real_t<T> operator /(real_t<T> const &x) const; |
|
|
|
real_t<T> const &operator +=(real_t<T> const &x); |
|
|
|
real_t<T> const &operator -=(real_t<T> const &x); |
|
|
|
real_t<T> const &operator *=(real_t<T> const &x); |
|
|
|
real_t<T> const &operator /=(real_t<T> const &x); |
|
|
|
|
|
|
|
lol_attr_nodiscard bool operator ==(real_t<T> const &x) const; |
|
|
|
lol_attr_nodiscard bool operator !=(real_t<T> const &x) const; |
|
|
|
lol_attr_nodiscard bool operator <(real_t<T> const &x) const; |
|
|
|
lol_attr_nodiscard bool operator >(real_t<T> const &x) const; |
|
|
|
lol_attr_nodiscard bool operator <=(real_t<T> const &x) const; |
|
|
|
lol_attr_nodiscard bool operator >=(real_t<T> const &x) const; |
|
|
|
|
|
|
|
lol_attr_nodiscard bool operator !() const; |
|
|
|
lol_attr_nodiscard operator bool() const; |
|
|
|
|
|
|
|
/* Comparison functions */ |
|
|
|
template<typename U> friend Real<U> min(Real<U> const &a, Real<U> const &b); |
|
|
|
template<typename U> friend Real<U> max(Real<U> const &a, Real<U> const &b); |
|
|
|
template<typename U> friend Real<U> clamp(Real<U> const &x, |
|
|
|
Real<U> const &a, Real<U> const &b); |
|
|
|
|
|
|
|
/* Trigonometric functions */ |
|
|
|
template<typename U> friend Real<U> sin(Real<U> const &x); |
|
|
|
template<typename U> friend Real<U> cos(Real<U> const &x); |
|
|
|
template<typename U> friend Real<U> tan(Real<U> const &x); |
|
|
|
template<typename U> friend Real<U> asin(Real<U> const &x); |
|
|
|
template<typename U> friend Real<U> acos(Real<U> const &x); |
|
|
|
template<typename U> friend Real<U> atan(Real<U> const &x); |
|
|
|
template<typename U> friend Real<U> atan2(Real<U> const &y, Real<U> const &x); |
|
|
|
|
|
|
|
/* Hyperbolic functions */ |
|
|
|
template<typename U> friend Real<U> sinh(Real<U> const &x); |
|
|
|
template<typename U> friend Real<U> cosh(Real<U> const &x); |
|
|
|
template<typename U> friend Real<U> tanh(Real<U> const &x); |
|
|
|
|
|
|
|
/* Exponential and logarithmic functions */ |
|
|
|
template<typename U> friend Real<U> exp(Real<U> const &x); |
|
|
|
template<typename U> friend Real<U> exp2(Real<U> const &x); |
|
|
|
template<typename U> friend Real<U> erf(Real<U> const &x); |
|
|
|
template<typename U> friend Real<U> log(Real<U> const &x); |
|
|
|
template<typename U> friend Real<U> log2(Real<U> const &x); |
|
|
|
template<typename U> friend Real<U> log10(Real<U> const &x); |
|
|
|
|
|
|
|
/* Floating-point functions */ |
|
|
|
template<typename U> friend Real<U> frexp(Real<U> const &x, typename Real<U>::exponent_t *exp); |
|
|
|
template<typename U> friend Real<U> ldexp(Real<U> const &x, typename Real<U>::exponent_t exp); |
|
|
|
template<typename U> friend Real<U> modf(Real<U> const &x, Real<U> *iptr); |
|
|
|
template<typename U> friend Real<U> nextafter(Real<U> const &x, Real<U> const &y); |
|
|
|
|
|
|
|
/* Power functions */ |
|
|
|
template<typename U> friend Real<U> inverse(Real<U> const &x); |
|
|
|
template<typename U> friend Real<U> sqrt(Real<U> const &x); |
|
|
|
template<typename U> friend Real<U> cbrt(Real<U> const &x); |
|
|
|
template<typename U> friend Real<U> pow(Real<U> const &x, Real<U> const &y); |
|
|
|
template<typename U> friend Real<U> gamma(Real<U> const &x); |
|
|
|
|
|
|
|
/* Rounding, absolute value, remainder etc. */ |
|
|
|
template<typename U> friend Real<U> ceil(Real<U> const &x); |
|
|
|
template<typename U> friend Real<U> copysign(Real<U> const &x, Real<U> const &y); |
|
|
|
template<typename U> friend Real<U> floor(Real<U> const &x); |
|
|
|
template<typename U> friend Real<U> fabs(Real<U> const &x); |
|
|
|
template<typename U> friend Real<U> round(Real<U> const &x); |
|
|
|
template<typename U> friend Real<U> fmod(Real<U> const &x, Real<U> const &y); |
|
|
|
|
|
|
|
/* Functions inherited from GLSL */ |
|
|
|
template<typename U> friend Real<U> abs(Real<U> const &x); |
|
|
|
template<typename U> friend Real<U> fract(Real<U> const &x); |
|
|
|
template<typename U> friend Real<U> degrees(Real<U> const &x); |
|
|
|
template<typename U> friend Real<U> radians(Real<U> const &x); |
|
|
|
|
|
|
|
/* Additional functions */ |
|
|
|
template<typename U> friend Real<U> franke(Real<U> const &x, Real<U> const &y); |
|
|
|
template<typename U> friend Real<U> peaks(Real<U> const &x, Real<U> const &y); |
|
|
|
lol_attr_nodiscard explicit operator bool() const; |
|
|
|
|
|
|
|
// Comparison functions |
|
|
|
template<typename U> friend real_t<U> min(real_t<U> const &a, |
|
|
|
real_t<U> const &b); |
|
|
|
template<typename U> friend real_t<U> max(real_t<U> const &a, |
|
|
|
real_t<U> const &b); |
|
|
|
template<typename U> friend real_t<U> clamp(real_t<U> const &x, |
|
|
|
real_t<U> const &a, |
|
|
|
real_t<U> const &b); |
|
|
|
|
|
|
|
// Trigonometric functions |
|
|
|
template<typename U> friend real_t<U> sin(real_t<U> const &x); |
|
|
|
template<typename U> friend real_t<U> cos(real_t<U> const &x); |
|
|
|
template<typename U> friend real_t<U> tan(real_t<U> const &x); |
|
|
|
template<typename U> friend real_t<U> asin(real_t<U> const &x); |
|
|
|
template<typename U> friend real_t<U> acos(real_t<U> const &x); |
|
|
|
template<typename U> friend real_t<U> atan(real_t<U> const &x); |
|
|
|
template<typename U> friend real_t<U> atan2(real_t<U> const &y, |
|
|
|
real_t<U> const &x); |
|
|
|
|
|
|
|
// Hyperbolic functions |
|
|
|
template<typename U> friend real_t<U> sinh(real_t<U> const &x); |
|
|
|
template<typename U> friend real_t<U> cosh(real_t<U> const &x); |
|
|
|
template<typename U> friend real_t<U> tanh(real_t<U> const &x); |
|
|
|
|
|
|
|
// Exponential and logarithmic functions |
|
|
|
template<typename U> friend real_t<U> exp(real_t<U> const &x); |
|
|
|
template<typename U> friend real_t<U> exp2(real_t<U> const &x); |
|
|
|
template<typename U> friend real_t<U> erf(real_t<U> const &x); |
|
|
|
template<typename U> friend real_t<U> log(real_t<U> const &x); |
|
|
|
template<typename U> friend real_t<U> log2(real_t<U> const &x); |
|
|
|
template<typename U> friend real_t<U> log10(real_t<U> const &x); |
|
|
|
|
|
|
|
// Floating-point functions |
|
|
|
template<typename U> friend real_t<U> frexp(real_t<U> const &x, |
|
|
|
typename real_t<U>::exponent_t *exp); |
|
|
|
template<typename U> friend real_t<U> ldexp(real_t<U> const &x, |
|
|
|
typename real_t<U>::exponent_t exp); |
|
|
|
template<typename U> friend real_t<U> modf(real_t<U> const &x, |
|
|
|
real_t<U> *iptr); |
|
|
|
template<typename U> friend real_t<U> nextafter(real_t<U> const &x, |
|
|
|
real_t<U> const &y); |
|
|
|
|
|
|
|
// Power functions |
|
|
|
template<typename U> friend real_t<U> inverse(real_t<U> const &x); |
|
|
|
template<typename U> friend real_t<U> sqrt(real_t<U> const &x); |
|
|
|
template<typename U> friend real_t<U> cbrt(real_t<U> const &x); |
|
|
|
template<typename U> friend real_t<U> pow(real_t<U> const &x, |
|
|
|
real_t<U> const &y); |
|
|
|
template<typename U> friend real_t<U> gamma(real_t<U> const &x); |
|
|
|
|
|
|
|
// Rounding, absolute value, remainder etc. |
|
|
|
template<typename U> friend real_t<U> ceil(real_t<U> const &x); |
|
|
|
template<typename U> friend real_t<U> copysign(real_t<U> const &x, |
|
|
|
real_t<U> const &y); |
|
|
|
template<typename U> friend real_t<U> floor(real_t<U> const &x); |
|
|
|
template<typename U> friend real_t<U> fabs(real_t<U> const &x); |
|
|
|
template<typename U> friend real_t<U> round(real_t<U> const &x); |
|
|
|
template<typename U> friend real_t<U> fmod(real_t<U> const &x, |
|
|
|
real_t<U> const &y); |
|
|
|
|
|
|
|
// Functions inherited from GLSL |
|
|
|
template<typename U> friend real_t<U> abs(real_t<U> const &x); |
|
|
|
template<typename U> friend real_t<U> fract(real_t<U> const &x); |
|
|
|
template<typename U> friend real_t<U> degrees(real_t<U> const &x); |
|
|
|
template<typename U> friend real_t<U> radians(real_t<U> const &x); |
|
|
|
|
|
|
|
// Additional functions |
|
|
|
template<typename U> friend real_t<U> franke(real_t<U> const &x, |
|
|
|
real_t<U> const &y); |
|
|
|
template<typename U> friend real_t<U> peaks(real_t<U> const &x, |
|
|
|
real_t<U> const &y); |
|
|
|
|
|
|
|
std::string str(int ndigits = 150) const; |
|
|
|
std::string xstr() const; |
|
|
|
|
|
|
|
/* Additional operators using base C++ types */ |
|
|
|
// Additional operators using base C++ types |
|
|
|
#define __LOL_REAL_OP_HELPER_GENERIC(op, type) \ |
|
|
|
inline Real<T> operator op(type x) const { return *this op (Real<T>)x; } \ |
|
|
|
inline Real<T> const &operator op##=(type x) { return *this = (*this op x); } |
|
|
|
inline real_t<T> operator op(type x) const { return *this op (real_t<T>)x; } \ |
|
|
|
inline real_t<T> const &operator op##=(type x) { return *this = (*this op x); } |
|
|
|
#define __LOL_REAL_OP_HELPER_FASTMULDIV(op, type) \ |
|
|
|
inline Real<T> operator op(type x) const \ |
|
|
|
inline real_t<T> operator op(type x) const \ |
|
|
|
{ \ |
|
|
|
Real<T> tmp = *this; return tmp op##= x; \ |
|
|
|
real_t<T> tmp = *this; return tmp op##= x; \ |
|
|
|
} \ |
|
|
|
inline Real<T> const &operator op##=(type x) \ |
|
|
|
inline real_t<T> const &operator op##=(type x) \ |
|
|
|
{ \ |
|
|
|
/* If multiplying or dividing by a power of two, take a shortcut */ \ |
|
|
|
if (!is_zero() && x && !(x & (x - 1))) \ |
|
|
@@ -179,7 +193,7 @@ public: |
|
|
|
m_exponent += 1 op 2 - 1; /* 1 if op is *, -1 if op is / */ \ |
|
|
|
} \ |
|
|
|
else \ |
|
|
|
*this = *this op (Real<T>)x; \ |
|
|
|
*this = *this op (real_t<T>)x; \ |
|
|
|
return *this; \ |
|
|
|
} |
|
|
|
#define __LOL_REAL_OP_HELPER_INT(type) \ |
|
|
@@ -201,36 +215,36 @@ public: |
|
|
|
__LOL_REAL_OP_HELPER_FLOAT(double) |
|
|
|
__LOL_REAL_OP_HELPER_FLOAT(long double) |
|
|
|
|
|
|
|
/* Constants */ |
|
|
|
static Real<T> const R_0(); |
|
|
|
static Real<T> const& R_1(); |
|
|
|
static Real<T> const& R_2(); |
|
|
|
static Real<T> const& R_3(); |
|
|
|
static Real<T> const& R_4(); |
|
|
|
static Real<T> const& R_10(); |
|
|
|
|
|
|
|
static Real<T> const& R_E(); |
|
|
|
static Real<T> const& R_LOG2E(); |
|
|
|
static Real<T> const& R_LOG10E(); |
|
|
|
static Real<T> const& R_LN2(); |
|
|
|
static Real<T> const& R_LN10(); |
|
|
|
static Real<T> const& R_PI(); |
|
|
|
static Real<T> const& R_PI_2(); |
|
|
|
static Real<T> const& R_PI_3(); |
|
|
|
static Real<T> const& R_PI_4(); |
|
|
|
static Real<T> const& R_TAU(); |
|
|
|
static Real<T> const& R_1_PI(); |
|
|
|
static Real<T> const& R_2_PI(); |
|
|
|
static Real<T> const& R_2_SQRTPI(); |
|
|
|
static Real<T> const& R_SQRT2(); |
|
|
|
static Real<T> const& R_SQRT3(); |
|
|
|
static Real<T> const& R_SQRT1_2(); |
|
|
|
|
|
|
|
static Real<T> const R_INF(); |
|
|
|
static Real<T> const R_NAN(); |
|
|
|
|
|
|
|
static Real<T> const& R_MIN(); |
|
|
|
static Real<T> const& R_MAX(); |
|
|
|
// Constants |
|
|
|
static real_t<T> const R_0(); |
|
|
|
static real_t<T> const& R_1(); |
|
|
|
static real_t<T> const& R_2(); |
|
|
|
static real_t<T> const& R_3(); |
|
|
|
static real_t<T> const& R_4(); |
|
|
|
static real_t<T> const& R_10(); |
|
|
|
|
|
|
|
static real_t<T> const& R_E(); |
|
|
|
static real_t<T> const& R_LOG2E(); |
|
|
|
static real_t<T> const& R_LOG10E(); |
|
|
|
static real_t<T> const& R_LN2(); |
|
|
|
static real_t<T> const& R_LN10(); |
|
|
|
static real_t<T> const& R_PI(); |
|
|
|
static real_t<T> const& R_PI_2(); |
|
|
|
static real_t<T> const& R_PI_3(); |
|
|
|
static real_t<T> const& R_PI_4(); |
|
|
|
static real_t<T> const& R_TAU(); |
|
|
|
static real_t<T> const& R_1_PI(); |
|
|
|
static real_t<T> const& R_2_PI(); |
|
|
|
static real_t<T> const& R_2_SQRTPI(); |
|
|
|
static real_t<T> const& R_SQRT2(); |
|
|
|
static real_t<T> const& R_SQRT3(); |
|
|
|
static real_t<T> const& R_SQRT1_2(); |
|
|
|
|
|
|
|
static real_t<T> const R_INF(); |
|
|
|
static real_t<T> const R_NAN(); |
|
|
|
|
|
|
|
static real_t<T> const& R_MIN(); |
|
|
|
static real_t<T> const& R_MAX(); |
|
|
|
|
|
|
|
private: |
|
|
|
std::vector<T> m_mantissa; |
|
|
@@ -246,135 +260,15 @@ public: |
|
|
|
}; |
|
|
|
|
|
|
|
template<typename U> |
|
|
|
std::ostream& operator <<(std::ostream &s, Real<U> const &x); |
|
|
|
|
|
|
|
/* |
|
|
|
* Mandatory forward declarations of template specialisations |
|
|
|
*/ |
|
|
|
template<> real::Real(float f); |
|
|
|
template<> real::Real(double f); |
|
|
|
template<> real::Real(long double f); |
|
|
|
template<> real::Real(int32_t i); |
|
|
|
template<> real::Real(uint32_t i); |
|
|
|
template<> real::Real(int64_t i); |
|
|
|
template<> real::Real(uint64_t i); |
|
|
|
template<> real::Real(char const *str); |
|
|
|
|
|
|
|
template<> lol_attr_nodiscard real::operator float() const; |
|
|
|
template<> lol_attr_nodiscard real::operator double() const; |
|
|
|
template<> lol_attr_nodiscard real::operator long double() const; |
|
|
|
template<> lol_attr_nodiscard real::operator int32_t() const; |
|
|
|
template<> lol_attr_nodiscard real::operator uint32_t() const; |
|
|
|
template<> lol_attr_nodiscard real::operator int64_t() const; |
|
|
|
template<> lol_attr_nodiscard real::operator uint64_t() const; |
|
|
|
template<> real real::operator +() const; |
|
|
|
template<> real real::operator -() const; |
|
|
|
template<> real real::operator +(real const &x) const; |
|
|
|
template<> real real::operator -(real const &x) const; |
|
|
|
template<> real real::operator *(real const &x) const; |
|
|
|
template<> real real::operator /(real const &x) const; |
|
|
|
template<> real const &real::operator +=(real const &x); |
|
|
|
template<> real const &real::operator -=(real const &x); |
|
|
|
template<> real const &real::operator *=(real const &x); |
|
|
|
template<> real const &real::operator /=(real const &x); |
|
|
|
template<> lol_attr_nodiscard bool real::operator ==(real const &x) const; |
|
|
|
template<> lol_attr_nodiscard bool real::operator !=(real const &x) const; |
|
|
|
template<> lol_attr_nodiscard bool real::operator <(real const &x) const; |
|
|
|
template<> lol_attr_nodiscard bool real::operator >(real const &x) const; |
|
|
|
template<> lol_attr_nodiscard bool real::operator <=(real const &x) const; |
|
|
|
template<> lol_attr_nodiscard bool real::operator >=(real const &x) const; |
|
|
|
template<> lol_attr_nodiscard bool real::operator !() const; |
|
|
|
template<> lol_attr_nodiscard real::operator bool() const; |
|
|
|
|
|
|
|
template<typename U> Real<U> min(Real<U> const &a, Real<U> const &b); |
|
|
|
template<typename U> Real<U> max(Real<U> const &a, Real<U> const &b); |
|
|
|
template<typename U> Real<U> clamp(Real<U> const &x, |
|
|
|
Real<U> const &a, Real<U> const &b); |
|
|
|
|
|
|
|
template<typename U> Real<U> sin(Real<U> const &x); |
|
|
|
template<typename U> Real<U> cos(Real<U> const &x); |
|
|
|
template<typename U> Real<U> tan(Real<U> const &x); |
|
|
|
template<typename U> Real<U> asin(Real<U> const &x); |
|
|
|
template<typename U> Real<U> acos(Real<U> const &x); |
|
|
|
template<typename U> Real<U> atan(Real<U> const &x); |
|
|
|
template<typename U> Real<U> atan2(Real<U> const &y, Real<U> const &x); |
|
|
|
template<typename U> Real<U> sinh(Real<U> const &x); |
|
|
|
template<typename U> Real<U> cosh(Real<U> const &x); |
|
|
|
template<typename U> Real<U> tanh(Real<U> const &x); |
|
|
|
template<typename U> Real<U> exp(Real<U> const &x); |
|
|
|
template<typename U> Real<U> exp2(Real<U> const &x); |
|
|
|
template<typename U> Real<U> erf(Real<U> const &x); |
|
|
|
template<typename U> Real<U> log(Real<U> const &x); |
|
|
|
template<typename U> Real<U> log2(Real<U> const &x); |
|
|
|
template<typename U> Real<U> log10(Real<U> const &x); |
|
|
|
template<typename U> Real<U> frexp(Real<U> const &x, typename Real<U>::exponent_t *exp); |
|
|
|
template<typename U> Real<U> ldexp(Real<U> const &x, typename Real<U>::exponent_t exp); |
|
|
|
template<typename U> Real<U> modf(Real<U> const &x, Real<U> *iptr); |
|
|
|
template<typename U> Real<U> nextafter(Real<U> const &x, Real<U> const &y); |
|
|
|
template<typename U> Real<U> inverse(Real<U> const &x); |
|
|
|
template<typename U> Real<U> sqrt(Real<U> const &x); |
|
|
|
template<typename U> Real<U> cbrt(Real<U> const &x); |
|
|
|
template<typename U> Real<U> pow(Real<U> const &x, Real<U> const &y); |
|
|
|
template<typename U> Real<U> gamma(Real<U> const &x); |
|
|
|
template<typename U> Real<U> ceil(Real<U> const &x); |
|
|
|
template<typename U> Real<U> copysign(Real<U> const &x, Real<U> const &y); |
|
|
|
template<typename U> Real<U> floor(Real<U> const &x); |
|
|
|
template<typename U> Real<U> fabs(Real<U> const &x); |
|
|
|
template<typename U> Real<U> round(Real<U> const &x); |
|
|
|
template<typename U> Real<U> fmod(Real<U> const &x, Real<U> const &y); |
|
|
|
template<typename U> Real<U> abs(Real<U> const &x); |
|
|
|
template<typename U> Real<U> fract(Real<U> const &x); |
|
|
|
template<typename U> Real<U> degrees(Real<U> const &x); |
|
|
|
template<typename U> Real<U> radians(Real<U> const &x); |
|
|
|
template<typename U> Real<U> franke(Real<U> const &x, Real<U> const &y); |
|
|
|
template<typename U> Real<U> peaks(Real<U> const &x, Real<U> const &y); |
|
|
|
|
|
|
|
template<> real min(real const &a, real const &b); |
|
|
|
template<> real max(real const &a, real const &b); |
|
|
|
template<> real clamp(real const &x, real const &a, real const &b); |
|
|
|
|
|
|
|
template<> real sin(real const &x); |
|
|
|
template<> real cos(real const &x); |
|
|
|
template<> real tan(real const &x); |
|
|
|
template<> real asin(real const &x); |
|
|
|
template<> real acos(real const &x); |
|
|
|
template<> real atan(real const &x); |
|
|
|
template<> real atan2(real const &y, real const &x); |
|
|
|
template<> real sinh(real const &x); |
|
|
|
template<> real cosh(real const &x); |
|
|
|
template<> real tanh(real const &x); |
|
|
|
template<> real exp(real const &x); |
|
|
|
template<> real exp2(real const &x); |
|
|
|
template<> real erf(real const &x); |
|
|
|
template<> real log(real const &x); |
|
|
|
template<> real log2(real const &x); |
|
|
|
template<> real log10(real const &x); |
|
|
|
template<> real frexp(real const &x, real::exponent_t *exp); |
|
|
|
template<> real ldexp(real const &x, real::exponent_t exp); |
|
|
|
template<> real modf(real const &x, real *iptr); |
|
|
|
template<> real nextafter(real const &x, real const &y); |
|
|
|
template<> real inverse(real const &x); |
|
|
|
template<> real sqrt(real const &x); |
|
|
|
template<> real cbrt(real const &x); |
|
|
|
template<> real pow(real const &x, real const &y); |
|
|
|
template<> real gamma(real const &x); |
|
|
|
template<> real ceil(real const &x); |
|
|
|
template<> real copysign(real const &x, real const &y); |
|
|
|
template<> real floor(real const &x); |
|
|
|
template<> real fabs(real const &x); |
|
|
|
template<> real round(real const &x); |
|
|
|
template<> real fmod(real const &x, real const &y); |
|
|
|
template<> real abs(real const &x); |
|
|
|
template<> real fract(real const &x); |
|
|
|
template<> real degrees(real const &x); |
|
|
|
template<> real radians(real const &x); |
|
|
|
template<> real franke(real const &x, real const &y); |
|
|
|
template<> real peaks(real const &x, real const &y); |
|
|
|
|
|
|
|
template<> std::string real::str(int ndigits) const; |
|
|
|
template<> std::string real::xstr() const; |
|
|
|
|
|
|
|
} /* namespace lol */ |
|
|
|
std::ostream& operator <<(std::ostream &s, real_t<U> const &x); |
|
|
|
|
|
|
|
typedef real_t<uint32_t> real; |
|
|
|
|
|
|
|
} // namespace lol |
|
|
|
|
|
|
|
#include "private/real.ipp" |
|
|
|
|
|
|
|
#if _MSC_VER |
|
|
|
# pragma pop_macro("min") |
|
|
|
# pragma pop_macro("max") |
|
|
|
#endif |