25#ifndef __JOIN_DIYFP_HPP__
26#define __JOIN_DIYFP_HPP__
47 constexpr DiyFp () noexcept = default;
60 constexpr
DiyFp& operator= (const
DiyFp& other) noexcept = default;
66 explicit
DiyFp (
double value) noexcept
69 memcpy (&u64, &value,
sizeof (
double));
90 constexpr DiyFp (uint64_t mantissa,
int exponent) noexcept
124 inline constexpr DiyFp& normalizeBoundary () noexcept
152 plus.normalizeBoundary ();
155 minus._mantissa = (
_mantissa << (special ? 2 : 1)) - 1;
156 minus._exponent =
_exponent - (special ? 2 : 1);
158 const int diff = minus._exponent - plus._exponent;
159 minus._mantissa <<= diff;
160 minus._exponent = plus._exponent;
181 #if defined(__SIZEOF_INT128__)
182 __uint128_t product =
static_cast <__uint128_t
> (
_mantissa) *
static_cast <__uint128_t
> (rhs._mantissa);
183 _mantissa =
static_cast <uint64_t
> ((product >> 64) + ((product >> 63) & 1));
185 uint64_t M32 = 0xFFFFFFFFU;
189 uint64_t c = rhs._mantissa >> 32;
190 uint64_t d = rhs._mantissa & M32;
197 uint64_t tmp = (bd >> 32) + (ad & M32) + (bc & M32) + (1U << 31);
198 _mantissa = ac + (ad >> 32) + (bc >> 32) + (tmp >> 32);
209 static constexpr int _mantissaSize = std::numeric_limits <double>::digits - 1;
221 static constexpr uint64_t
_hiddenBit = 0x0010000000000000LLU;
238 return DiyFp (lhs) -= rhs;
249 return DiyFp (lhs) *= rhs;
hand made floating point.
Definition diyfp.hpp:42
static constexpr int _exponentBias
exponent bias.
Definition diyfp.hpp:212
static constexpr uint64_t _exponentMask
exponent mask.
Definition diyfp.hpp:218
static constexpr int _mantissaSize
double mantissa size.
Definition diyfp.hpp:209
static constexpr uint64_t _hiddenBit
hidden bit.
Definition diyfp.hpp:221
constexpr DiyFp() noexcept=default
default constructor.
constexpr DiyFp(uint64_t mantissa, int exponent) noexcept
create floating point using mantissa and exponent.
Definition diyfp.hpp:90
int _exponent
exponent.
Definition diyfp.hpp:227
static constexpr int _diyMantissaSize
home made double mantissa size.
Definition diyfp.hpp:206
constexpr DiyFp & operator*=(const DiyFp &rhs) noexcept
multiplication operator.
Definition diyfp.hpp:179
constexpr DiyFp & operator-=(const DiyFp &rhs) noexcept
minus operator
Definition diyfp.hpp:168
uint64_t _mantissa
mantissa.
Definition diyfp.hpp:224
static constexpr uint64_t _mantissaMask
mantissa mask.
Definition diyfp.hpp:215
~DiyFp()=default
destroy instance.
constexpr void normalizedBoundaries(DiyFp &minus, DiyFp &plus) const noexcept
get normalized boundaries.
Definition diyfp.hpp:148
constexpr DiyFp & normalize() noexcept
normalize floating point.
Definition diyfp.hpp:105
Definition acceptor.hpp:32
constexpr DiyFp operator*(const DiyFp &lhs, const DiyFp &rhs)
multiplication operator.
Definition diyfp.hpp:247
constexpr DiyFp operator-(const DiyFp &lhs, const DiyFp &rhs)
minus operator
Definition diyfp.hpp:236