25#ifndef JOIN_DATA_DIYFP_HPP
26#define JOIN_DATA_DIYFP_HPP
46 constexpr DiyFp () noexcept = default;
59 constexpr
DiyFp& operator= (const
DiyFp& other) noexcept = default;
65 explicit
DiyFp (
double value) noexcept
68 memcpy (&u64, &value,
sizeof (
double));
89 constexpr DiyFp (uint64_t mantissa,
int exponent) noexcept
123 inline constexpr DiyFp& normalizeBoundary () noexcept
151 plus.normalizeBoundary ();
154 minus._mantissa = (
_mantissa << (special ? 2 : 1)) - 1;
155 minus._exponent =
_exponent - (special ? 2 : 1);
157 const int diff = minus._exponent - plus._exponent;
158 minus._mantissa <<= diff;
159 minus._exponent = plus._exponent;
180#if defined(__SIZEOF_INT128__)
181 __uint128_t product =
static_cast<__uint128_t
> (
_mantissa) *
static_cast<__uint128_t
> (rhs._mantissa);
182 _mantissa =
static_cast<uint64_t
> ((product >> 64) + ((product >> 63) & 1));
184 uint64_t M32 = 0xFFFFFFFFU;
188 uint64_t c = rhs._mantissa >> 32;
189 uint64_t d = rhs._mantissa & M32;
196 uint64_t tmp = (bd >> 32) + (ad & M32) + (bc & M32) + (1U << 31);
197 _mantissa = ac + (ad >> 32) + (bc >> 32) + (tmp >> 32);
208 static constexpr int _mantissaSize = std::numeric_limits<double>::digits - 1;
220 static constexpr uint64_t
_hiddenBit = 0x0010000000000000LLU;
237 return DiyFp (lhs) -= rhs;
248 return DiyFp (lhs) *= rhs;
hand made floating point.
Definition diyfp.hpp:41
static constexpr int _exponentBias
exponent bias.
Definition diyfp.hpp:211
static constexpr uint64_t _exponentMask
exponent mask.
Definition diyfp.hpp:217
static constexpr int _mantissaSize
double mantissa size.
Definition diyfp.hpp:208
static constexpr uint64_t _hiddenBit
hidden bit.
Definition diyfp.hpp:220
constexpr DiyFp() noexcept=default
default constructor.
constexpr DiyFp(uint64_t mantissa, int exponent) noexcept
create floating point using mantissa and exponent.
Definition diyfp.hpp:89
int _exponent
exponent.
Definition diyfp.hpp:226
static constexpr int _diyMantissaSize
home made double mantissa size.
Definition diyfp.hpp:205
constexpr DiyFp & operator*=(const DiyFp &rhs) noexcept
multiplication operator.
Definition diyfp.hpp:178
constexpr DiyFp & operator-=(const DiyFp &rhs) noexcept
minus operator
Definition diyfp.hpp:167
uint64_t _mantissa
mantissa.
Definition diyfp.hpp:223
static constexpr uint64_t _mantissaMask
mantissa mask.
Definition diyfp.hpp:214
~DiyFp()=default
destroy instance.
constexpr void normalizedBoundaries(DiyFp &minus, DiyFp &plus) const noexcept
get normalized boundaries.
Definition diyfp.hpp:147
constexpr DiyFp & normalize() noexcept
normalize floating point.
Definition diyfp.hpp:104
Definition acceptor.hpp:32
constexpr DiyFp operator*(const DiyFp &lhs, const DiyFp &rhs)
multiplication operator.
Definition diyfp.hpp:246
constexpr DiyFp operator-(const DiyFp &lhs, const DiyFp &rhs)
minus operator
Definition diyfp.hpp:235